ABSTRACT

Animal movements are often defined using the home range concept. Consequently, home ranges are determined by temporal, spatial, and individual-level processes. Within the environment, one of the key factors influencing an animal’s range and how it uses the environment is that of resources. Alterations to the environment that affect resource distribution and availability can have profound consequences on an animal’s spatial patterns. One of the best examples of this is that of golf courses. Certain environmental modifications exhibited by some human altered environments can have positive effects on certain wildlife species by altering their movement patterns and foraging efforts. We analyzed data collected from 22 Gila Monsters Heloderma suspectum at a subsidized environment in Arizona from 2007 to 2013 and 15 Gila Monsters from a non-subsidized environment from 2000 to 2002. We performed both kernel density estimation and minimum convex polygons for comparability purposes. After adjusting area estimates for sex, number of fixes, and year, males in the subsidized environment had an average overall area of 13.6 ha while the females had an area of 8.3 ha. In the unsubsidized environment, males had an average overall area of 43.2 ha while females had an area of 23.6 ha. Gila Monsters between the two environments also exhibited seasonal differences, primarily in the dry and monsoon seasons. There were also differences in home range overlap within and between sexes. In the subsidized population, there was very little male-male overlap with only two occurances, more female-female overlap and male-female overlap was increased. Male home ranges often overlapped several female home ranges. This suggests that Gila monster home ranges may be smaller in subsidized resource environments than those of un-subsidized environments due to increases in available resources.


Gila Monsters (Heloderma suspectum) and Human Altered Environments

Animal movements are often defined using the home range concept. Formally defined by William Burk in 1943 as, “that area traversed by the individual in its normal activities of foraging, mating, and caring for young. Occasional sallies outside the area, perhaps exploratory in nature, should not be considered part of the home range”. Consequently, home ranges are determined by temporal, spatial, and individual-level processes. Studying animal HR’s has been of special interest to a wide variety of researchers, including those studying relationships between behavior, age, sex, and spacing patterns, resource distribution as it affects space use, the relationship between metabolic requirements and home range size, and space requirements for purposes of controlling problematic species, conservation, and wildlife management.

Within an animals environment, one of the key factors influencing an animals range and how it uses the environment is that of resources. Alterations to the environment that affect resource distribution and availability can have profound consequences on an animals spatial patterns. Some of the best examples of this are alterations caused by human activities. Historically, human alterations to environments have been percieved as having negative consequences on local wildlife populations. However, certain environmental modifications can have positive effects on various wildlife species. This is seen in the implementation of certain golf courses, and green areas. One of the key consequences of golf courses, especially those placed in desert environments is the water irrigation supplementation and horticulture that comes with them. As a result, this enhances primary productivity which increases the presence of vertebrate animals that take advantage of that increase in productivity. In reptiles, faster growth is often correlated with increases in precipitation and available resources. A Recent study has shown that Gila Monsters Heloderma suspectum inhabiting a golf course in the upland Sonoran of Arizona grew larger and faster than unsubsidized populations.

Gila Monsters occupy the hot desert regions of the Mohave Desert in the extreme southeastern Nevada, south through the Sonoran Desert of Arizona into Sonora and northern Sinaloa, Mexico. Gilas are known to be “widely foraging” animals due to their specialization in feeding on the young and eggs of small vertebrate nests. These characteristics and findings make this species a good candidate for studying the potential alterations to animal home ranges that nutrient subsidized areas such as golf courses may have on animal populations.


Study Site

For the subsidized resource population occupying a human altered environment, spatial data was collected on 22 Gila Monsters, 13 females and 9 males at Stone Canyon Golf Club, located in Pima County, Arizona at the base of the Tortolita Mountains. Stone Canyon is a golf club with an area of approximately 345 hectares, consisting of vegetation that is typical of Sonoran desertscrub habitat of the Arizona uplands. Elevation ranges from 900m-1000m, with the landscape consisting of granite outcrop hills with large boulders throughout, interrupted by watered fairways, ponds and paved cart paths. This golf course possesses a partially urbanized housing development with properties encompassing the perimeter of the course.


Figure 1 | Stone Canyon Golf Club, located in Oro Valley, Arizona on the northern edge of Tucson, Arizona.


For the comparison site, the unsubsidized natural population was represented using spatial data that was collected on 15 Gila Monsters, 6 males, 6 females and 3 sub-adults from 2000-2002 using radio-telemetry at Owl Head Buttes, Arizona. Located in Arizona upland Sonoran Desert approximately 19 km north northeast of Stone Canyon, the Owl Head Buttes study site was an area of approximately 200 hectares, with an elevation range of 800m-900m, and discontinuous southern buttes of rocky outcrops. Owl Head harbors no urbanized development or other human altered environments aside from highly spaced unpaved dirt access roads throughout the surrounding area.


Overall Yearly Home Ranges (MCP)

Summary of home range size.

Table 1 | Pooled overall home ranges of Gila Monsters at Owl Head Buttes and Stone Canyon Golf Club. Both 100% and 95% MCPs were calculated between both populations.
Year Gila Sex Environment Home_Range_100mcp N100 Home_Range_95mcp N95
2000 1 female nonsubsidized 25.20 42 23.00 38
_ 2 male nonsubsidized 28.70 125 24.50 112
_ 3 male nonsubsidized 82.70 89 68.40 78
_ 4 male nonsubsidized 55.60 80 40.50 73
2001 1 female nonsubsidized 20.10 26 NA NA
_ 2 male nonsubsidized 23.50 10 NA NA
_ 3 male nonsubsidized 60.10 18 NA NA
_ 4 male nonsubsidized 24.40 21 NA NA
_ 10 male nonsubsidized 28.50 14 NA NA
_ 11 male nonsubsidized 10.60 22 NA NA
_ 12 male nonsubsidized 23.60 7 NA NA
_ 13 female nonsubsidized 8.90 9 NA NA
_ 15 female nonsubsidized 13.00 11 NA NA
_ 50 female nonsubsidized 21.00 11 NA NA
_ 51 female nonsubsidized 7.10 8 NA NA
2002 2 male nonsubsidized 66.20 38 40.00 37
_ 4 male nonsubsidized 73.10 76 55.50 73
_ 10 male nonsubsidized 39.50 111 33.30 105
_ 11 male nonsubsidized 39.30 92 31.90 88
_ 12 male nonsubsidized 49.50 66 41.50 63
_ 13 female nonsubsidized 26.30 101 23.70 96
_ 15 female nonsubsidized 39.20 98 21.30 94
_ 17 female nonsubsidized 47.60 106 29.10 101
_ 50 female nonsubsidized 15.80 68 14.10 66
_ 51 female nonsubsidized 18.50 57 12.40 57
2007 F104 female subsidized 3.37 18 3.37 19
_ F114 female subsidized 2.51 8 0.58 7
_ F36 female subsidized 5.05 20 3.49 19
_ F66 female subsidized 10.23 22 5.56 20
_ M112 male subsidized 12.51 13 12.51 12
_ M14 male subsidized 4.66 15 3.87 14
2008 F104 female subsidized 4.97 53 3.47 50
_ F114 female subsidized 11.96 52 9.38 49
_ F135 female subsidized 4.07 16 1.58 15
_ F137 female subsidized 5.98 15 5.75 14
_ F36 female subsidized 9.73 54 7.55 51
_ F66 female subsidized 11.29 51 9.95 48
_ M119 male subsidized 25.01 58 20.23 55
2009 F104 female subsidized 7.45 64 7.25 62
_ F114 female subsidized 11.46 52 8.28 49
_ F135 female subsidized 6.21 62 5.47 58
_ F137 female subsidized 6.09 35 5.68 33
_ F147 female subsidized 17.90 50 14.04 48
_ F36 female subsidized 7.48 62 5.83 60
_ F66 female subsidized 12.20 67 11.01 66
_ M112 female subsidized 7.89 71 1.73 70
_ M119 male subsidized 22.62 18 16.37 16
_ M69 male subsidized 1.91 69 1.91 69
_ F146 female subsidized 9.94 20 8.49 17
2010 F114 female subsidized 9.65 44 8.30 41
_ F137 female subsidized 6.32 45 5.26 42
_ F147 female subsidized 16.65 36 14.75 34
_ F200 female subsidized 5.36 34 5.23 33
_ F214 female subsidized 7.38 27 3.01 25
_ F36 female subsidized 38.81 50 12.16 47
_ F66 female subsidized 28.96 52 16.22 49
_ M112 male subsidized 20.46 26 14.41 24
_ M119 male subsidized 17.46 31 9.70 29
_ M69 male subsidized 13.85 30 10.75 28
2011 F114 female subsidized 5.91 22 3.30 20
_ F137 female subsidized 4.80 33 4.28 31
_ F147 female subsidized 19.44 24 12.90 22
_ F200 female subsidized 8.35 28 7.66 27
_ F214 female subsidized 6.61 22 5.66 21
_ F252 female subsidized 3.09 17 1.60 16
_ F36 female subsidized 11.93 23 10.95 21
_ F66 female subsidized 5.72 5 0.66 4
_ M14 male subsidized 4.48 13 3.84 12
_ M215 male subsidized 11.47 16 11.47 15
_ M255 male subsidized 5.85 16 5.59 15
2012 F114 female subsidized 10.17 54 7.15 51
_ F137 female subsidized 2.06 13 1.36 12
_ F147 female subsidized 17.64 52 16.75 49
_ F252 female subsidized 5.19 53 3.63 50
_ F36 female subsidized 10.34 52 10.30 49
_ M14 male subsidized 4.42 13 3.77 12
_ M215 male subsidized 11.04 21 9.85 20
_ M255 male subsidized 8.21 13 5.39 12
2013 F114 female subsidized 1.16 7 0.28 6
_ F147 female subsidized 0.31 6 0.00 5
_ F252 female subsidized NA 4 NA NA
_ F36 female subsidized 0.13 6 0.00 5
Overall combined 100% MCP means averages across sex
Environment N Home_Range_100mcp sd se ci
nonsubsidized 25 33.92000 20.793689 4.1587378 8.583213
subsidized 54 10.46278 6.897586 0.9386426 1.882679

Gila Monster Home Range Sizes at Stone Canyon vs. Owl Head Buttes.


Table 2 | Raw group 100% MCP home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
Environment Sex N Home_Range_100mcp sd se ci
nonsubsidized female 11 22.063636 12.287414 3.704795 8.254797
nonsubsidized male 14 43.235714 21.672372 5.792185 12.513255
subsidized female 37 9.836757 6.984007 1.148164 2.328584
subsidized male 17 11.825294 6.706133 1.626476 3.447976
Table 3 | Raw group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
Environment Sex N Home_Range_95mcp sd se ci
nonsubsidized female 6 20.600000 6.286493 2.5664502 6.597270
nonsubsidized male 8 41.950000 13.987954 4.9454886 11.694222
subsidized female 37 7.132432 4.339651 0.7134342 1.446912
subsidized male 17 9.037059 4.934157 1.1967090 2.536910

Gila Monster Yearly Home Range Shifts of 100% MCPs.

Repeated measures ANOVA for Yearly Home Ranges.

ANOVA Table: 100% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                 Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment      688.97  688.97     1 71.486  8.3567 0.0050859 ** 
Year              31.66   31.66     1 71.627  0.3840 0.5374340    
Sex             1375.22 1375.22     1 24.656 16.6803 0.0004079 ***
N100            1797.13 1797.13     1 54.913 21.7978 1.994e-05 ***
Environment:Sex  445.09  445.09     1 25.582  5.3986 0.0283770 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

ANOVA Table: 95% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment     446.03  446.03     1 61.925 30.2487 7.669e-07 ***
Year             14.03   14.03     1 39.326  0.9515  0.335306    
Sex             426.44  426.44     1 29.915 28.9198 8.086e-06 ***
N100             14.22   14.22     1 39.534  0.9646  0.332015    
Environment:Sex 145.74  145.74     1 30.669  9.8835  0.003687 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table 4. Directional means of home range after being adjusted for year, sex and sample size.

Table 4. Directional means of home range after being adjusted for year, sex and sample size.
Environment Sex lsmean SE df lower.CL upper.CL
nonsubsidized female 23.739759 6.015077 66.85165 11.733125 35.74639
subsidized female 8.314934 3.281775 46.24553 1.710009 14.91986
nonsubsidized male 43.412310 6.061028 66.27236 31.312006 55.51261
subsidized male 13.146356 3.754579 53.70952 5.617946 20.67477

Post-Hoc comparisons between sexes and environment:

$emmeans
Environment = nonsubsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female  23.59 6.00 66.8    11.60     35.6
 male    43.24 6.05 66.3    31.17     55.3

Environment = subsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female   8.33 3.23 46.6     1.83     14.8
 male    13.68 3.89 49.2     5.87     21.5

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -19.66 4.86 31.6 -4.044  0.0003 

Environment = subsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male    -5.36 3.81 31.8 -1.405  0.1697 

Graphical Comparisons of Sex Within Each Environment:

Figure 6 | Pairwise comparisons of home range between sexes within each environment. If red arrows overlap those of others, then there is no significant statistical difference.

$emmeans
Sex = female:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  23.59 6.00 66.8    11.60     35.6
 subsidized      8.33 3.23 46.6     1.83     14.8

Sex = male:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  43.24 6.05 66.3    31.17     55.3
 subsidized     13.68 3.89 49.2     5.87     21.5

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Sex = female:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     15.3 8.31 68.7 1.837   0.0705 

Sex = male:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     29.6 8.69 68.3 3.403   0.0011 

Graphical Comparisons of Sex between the two populations:

Figure 7 | Pairwise comparisons of sex between environments. If red arrows overlap those of others, then there is no significant statistical difference.

At Stone Canyon, male yearly home ranges ranged from 1.91 - 25.1 ha, with a mean of 11.8 ± 1.7 S.E. ha (100% MCP), 9.2 ± 1.3 S.E. Ha (95% MCP). Female home ranges ranged from 2.06 – 38.81 ha and a mean of 9.8 ± 1.1 S.E. ha (100% MCP), 7.1 ± 0.7 S.E. ha (95% MCP). Male Gila Monsters at Owl head Buttes had home ranges that ranged from 10.6 – 82.7 ha with a mean of 43.2 ± 5.7 S.E. ha (100% MCP), 41.9 ± 4.9 S.E. ha (95% MCP). Female home ranges ranged from 7.1 – 47.6 with a mean of 22.0 ± 3.7 S.E. ha (100% MCP), 20.6 ± 2.5 S.E. ha (95% MCP). In the analyses of both populations, year had no effect on home range sizes (F = 0.38, P = 0.54), while there was a detected significant difference in home ranges between the two populations (F = 8.35, P = 0.005), as well as sex (F = 16.68, P = 0.0004). Post-Hoc analyses between sexes indicated that there was a significant difference in male home ranges between the two environments (df = 68.3, P = 0.001). There was a slight difference of female home ranges between the two environments, however it was not statistically significant (df = 68.7, P = 0.07). At stone canyon there was no major difference between male and female home ranges (df = 31.8, P = 0.16) with male home range being only 3% larger than females. Males at Owl Head Buttes had a 65% larger home range than did females, and was statistically significant (df = 31.3, P = 0.0003). Interestingly, males at Stone Canyon had smaller home ranges than did the females at Owl Head Buttes (Table x) When using 95% MCPs, male home ranges reduced by 25% and female range by 31%. At Owl Head Buttes, Gila Monsters showed a similar behavior with male home ranges reduced by 20% and female ranges reduced by 26% using 95% MCPs.

Overall Yearly Home Ranges (KDE)

Home range estimation on the Stone Canyon Gila Monsters using 95% KDEs with href bandwidth produced male home ranges ranging from 14.5 – 55.3 ha with a mean of 35.0 ± 3.3 S.E. ha. Female home ranges ranged from 10.1 – 47.8 ha with a mean of 22.9 ± 1.8 S.E. KDE estimates for male and female home ranges were 96% and 80% larger than MCP estimates. Repeated Measures analysis of KDEs suggested that there was a small significant difference between male and female home ranges at Stone Canyon (F = 5.56, P = 0.009). Year did not have an effect on home ranges (F = 0.57, P = 0.45).

Yearly KDE Home Ranges
Year Gila Sex Environment Home_Range_95kde N Home_Range_50kde N50
2007 F104 female subsidized 13.84 18 3.69 15
NA F36 female subsidized 16.51 20 4.26 16
NA F66 female subsidized 32.31 22 7.86 17
NA M67 male subsidized NA 16 8.97 12
NA M112 male subsidized NA 13 15.42 11
NA M14 male subsidized 14.52 15 3.76 12
NA M67 male subsidized 35.47 14 8.97 10
2008 F104 female subsidized 13.22 53 2.61 42
NA F114 female subsidized 20.55 52 3.68 38
NA F135 female subsidized 11.36 16 2.19 12
NA F137 female subsidized 20.51 15 5.61 14
NA F36 female subsidized 18.89 54 4.98 41
NA F66 female subsidized 39.30 50 9.97 43
NA M119 male subsidized 47.65 58 12.18 43
2009 F104 female subsidized 19.11 64 4.63 14
NA F114 female subsidized 20.34 52 4.08 43
NA F135 female subsidized 14.43 62 4.43 50
NA F137 female subsidized 16.94 35 4.99 32
NA F147 female subsidized 39.67 62 9.06 52
NA F36 female subsidized 13.96 67 3.20 52
NA F66 female subsidized 25.90 71 6.35 69
NA M112 female subsidized NA 18 14.27 17
NA M119 male subsidized 49.53 69 12.55 61
NA M69 male subsidized NA NA NA NA
NA F146 female subsidized 20.17 43 3.97 31
2010 F114 female subsidized 21.06 44 6.08 35
NA F137 female subsidized 13.24 45 3.33 13
NA F147 female subsidized 34.73 36 7.13 28
NA F200 female subsidized 20.37 34 4.09 25
NA F214 female subsidized 14.97 27 3.56 24
NA F36 female subsidized 47.49 50 9.73 37
NA F66 female subsidized 47.77 52 7.26 33
NA M112 male subsidized 55.25 26 8.60 21
NA M119 male subsidized 33.88 31 7.14 22
NA M69 male subsidized 37.45 30 10.49 22
NA F146 female subsidized 33.84 9 8.39 7
2011 F114 female subsidized 13.82 22 2.66 17
NA F137 female subsidized 12.12 33 2.65 25
NA F147 female subsidized 43.80 24 9.66 17
NA F200 female subsidized 23.96 28 6.86 26
NA F214 female subsidized 23.39 22 5.91 18
NA F252 female subsidized 8.55 17 1.94 14
NA F36 female subsidized 34.90 23 8.81 20
NA M14 male subsidized 20.36 12 5.27 10
NA M215 male subsidized 46.26 16 11.74 15
NA M255 male subsidized 30.10 16 8.25 15
2012 F114 female subsidized 21.04 54 5.41 45
NA F137 female subsidized 7.87 13 1.24 10
NA F147 female subsidized 32.98 52 7.74 36
NA F252 female subsidized 10.09 53 1.83 39
NA F36 female subsidized 27.59 52 7.67 39
NA M14 male subsidized 24.02 13 6.49 10
NA M215 male subsidized 28.52 21 7.31 15
NA M255 male subsidized 32.03 13 8.27 11
Table | Raw Group 95% KDE home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.
Sex N Home_Range_95kde sd se ci
female 36 23.06722 11.19254 1.865424 3.787012
male 14 33.94357 12.24405 3.272359 7.069503

Repeated measures ANOVA for KDE Home Ranges.

Repeated Measure ANOVA for 95% KDE overall home ranges

ANOVA Table for 95% KDE (subsidized)

Type III Analysis of Variance Table with Satterthwaite's method
     Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
Year  33.40   33.40     1 39.996  0.5754 0.452584   
Sex  497.09  497.09     1 17.713  8.5619 0.009133 **
N     21.54   21.54     1 37.466  0.3710 0.546150   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Repeated Measure ANOVA for 50% KDE overall home ranges

Error in eval(predvars, data, env) : object 'Home_Range_50kde' not found

ANOVA Table for 50% KDE (subsidized)

Table | Directional means of KDE home ranges after being adjusted for year, sex and sample size.
Season Sex lsmean SE df lower.CL upper.CL
Dry female 19.994371 4.908047 41.49770 10.085978 29.90277
Emergence female 17.014928 7.237399 42.42000 2.413550 31.61631
Monsoon female 19.938055 5.254150 40.80049 9.325509 30.55060
Post_Monsoon female 14.969630 5.291163 41.32600 4.286469 25.65279
Dry male 43.417018 6.385092 42.14273 30.532673 56.30136
Emergence male 17.576519 15.469710 43.58838 -13.608952 48.76199
Monsoon male 31.849802 5.728078 42.22605 20.291905 43.40770
Post_Monsoon male 2.648851 9.134861 43.32296 -15.769382 21.06708

Seasonal Home Range

Seasonal Home Range.

Home range analysis broken down by five seasons; Emergence, Dry, Monsoon, Post Monsoon. The start of emergence was defined by when movement patterns increased from none/minimal to the start of high activity. Effort was taken to match as closely as possible to the Owl Head Buttes emergence date interval. Monsoon season was adjusted using NOAA climate data. The start of was defined when the mean dew point temperatures of three consecutive days were greater than 55 degrees.

Scaling home range analyses by seasonal estimates reduces the number or locations for each lizard. 100% MCPs were used for seasonal home range analyses to avoid any further reduction of locations for each estimation.

Seasonal home ranges at Stone Canyon varied in size between seasons but did not seem shift (Fig.___), with seasonal home ranges overlapping each other, only expanding or collapsing between seasons. Home range patterns at Stone Canyon did not display the same seasonal variation in home range sizes that was observed at Owl Head Buttes. At Stone Canyon, Gila Monsters had relatively smaller home ranges throughout the year, where the highest inflation of range size was observed during the dry season from an increase in male home ranges, 18.2 ± 5.4 S.E. ha to that of female home range sizes at 10.1 ± 2.4 S.E. ha. Females at Stone Canyon displayed similar home ranges during the monsoon season, 10.6 ± 2.5 S.E. ha. Home range sizes at Owl Head Buttes had a much larger amount of variation across seasons than did those at Stone Canyon. There were still slightly larger ranges observed during the dry season, primarily due to increased home range sizes exhibited by males 29.4 ± 4.7 S.E. ha versus females at 15.6 ± 3.8 S.E. ha. During the monsoon season, there was still yet a large influx of home ranges sizes where female home ranges increased to 22.9 ± 4.0 S.E. ha. For both populations, home ranges during the emergence and post-monsoon seasons were small, marking the beginning and ending of overwintering periods, where minimal movement is observed in both groups.

Analysis indicated that there was an effect of season (df = 3, F = 15.41, P = <0.001) as well as an interaction of environment and season (df = 3, F = 6.84, P = <0.001), indicating that changes in seasonal home ranges sizes varied between each environment. Post-Hoc analyses on the Stone Canyon data set with home range means averaged across sex, suggested that there was no significant difference in home ranges between the emergence (4.32 ± 2.55 S.E. ha) and post-monsoon seasons (5.09 ± 2.07 S.E. ha) nor dry and monsoon (12.23 ± 1.74 S.E. ha and 9.04 ± 1.78 S.E. ha). There was also no significance between emergence and dry/monsoon seasons, but there was a difference between dry and post-monsoon (df = 80.2, P = 0.04). Post-Hoc analyses on the Owl Head Buttes population indicated that there was no significant difference between emergence (3.33 ± 2.24 S.E. ha) and post-monsoon (2.36 ± 2.36 S.E.) nor dry and monsoon (18.86 ± 2.25 S.E. ha and 21.85 ± 2.03 S.E. ha) reflecting the same pattern at Stone Canyon. However, there was a significant difference between emergence and dry/monsoon (df = 69.4, P = <0.0001, and df = 68, P = <0.0001 respectively), as well as post-monsoon and dry/monsoon (df = 78.9, P = <0.0001, and df = 74, P = <0.0001). This shows a rather different pattern than seen at Stone Canyon. Pairwise analyses between the two populations indicated no difference between emergence (df = 87.7, P = 0.76) or post-monsoon (df = 89.4, P = 0.35). Differences in home range sizes between the two populations were between the dry and monsoon seasons (Fig.___). Owl Head home ranges were 58% larger than those at Stone Canyon during the dry season, and 76% larger during the monsoon season.

Table 5 | Group means of seasonal home ranges between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized). These means are averaged across sex.
Environment Season N Home_Range_100mcp sd se ci
nonsubsidized Dry 12 23.7166667 12.841682 3.7070742 8.159215
nonsubsidized Emergence 10 2.8100000 3.121414 0.9870776 2.232925
nonsubsidized Monsoon 13 23.6538462 9.446482 2.6199828 5.708452
nonsubsidized Post_Monsoon 11 0.6909091 1.013365 0.3055411 0.680788
subsidized Dry 17 13.0364706 10.574940 2.5647997 5.437133
subsidized Emergence 9 2.0977778 1.649566 0.5498555 1.267969
subsidized Monsoon 18 10.5600000 7.518662 1.7721657 3.738943
subsidized Post_Monsoon 14 2.9885714 5.044404 1.3481737 2.912552
Type III Analysis of Variance Table with Satterthwaite's method
                    Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment         261.63  261.63     1 26.365  5.8375 0.0229042 *  
Season             2072.56  690.85     3 78.967 15.4143 5.534e-08 ***
Sex                 108.84  108.84     1 29.115  2.4285 0.1299532    
N                   335.38  335.38     1 72.754  7.4829 0.0078202 ** 
Environment:Season  920.94  306.98     3 71.524  6.8493 0.0004028 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Table 6 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.
Environment Season Sex N Home_Range_100mcp sd se ci
nonsubsidized Dry female 5 15.6600000 8.6291946 3.8590932 10.7145603
nonsubsidized Dry male 7 29.4714286 12.6476235 4.7803524 11.6971008
nonsubsidized Emergence female 5 4.4600000 3.4333657 1.5354478 4.2630866
nonsubsidized Emergence male 5 1.1600000 1.8242807 0.8158431 2.2651436
nonsubsidized Monsoon female 6 22.9833333 9.8151753 4.0070285 10.3003948
nonsubsidized Monsoon male 7 24.2285714 9.8668999 3.7293376 9.1253605
nonsubsidized Post_Monsoon female 4 1.4000000 1.4491377 0.7245688 2.3059014
nonsubsidized Post_Monsoon male 7 0.2857143 0.3670993 0.1387505 0.3395102
subsidized Dry female 11 10.1754545 8.0883118 2.4387178 5.4338018
subsidized Dry male 6 18.2816667 13.2661214 5.4158714 13.9219406
subsidized Emergence female 6 2.1133333 1.8474920 0.7542354 1.9388239
subsidized Emergence male 3 2.0666667 1.5326556 0.8848792 3.8073277
subsidized Monsoon female 11 10.6918182 8.4988679 2.5625051 5.7096172
subsidized Monsoon male 7 10.3528571 6.3010018 2.3815548 5.8274547
subsidized Post_Monsoon female 11 3.6309091 5.5527983 1.6742317 3.7304207
subsidized Post_Monsoon male 3 0.6333333 0.8007705 0.4623250 1.9892241

Adjusted Seasonal Means

Post-Hoc comparisons between populations for seasonal home range analysis:

$emmeans
Season = Dry:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  18.86 2.25 88.4   14.383    23.34
 subsidized     12.23 1.75 87.4    8.745    15.72

Season = Emergence:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   3.33 2.24 88.7   -1.118     7.77
 subsidized      4.32 2.55 84.7   -0.741     9.39

Season = Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  21.85 2.03 87.5   17.811    25.89
 subsidized      9.04 1.78 86.0    5.515    12.57

Season = Post_Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   2.36 2.36 87.0   -2.322     7.04
 subsidized      5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized    6.629 2.81 88.3  2.358  0.0206 

Season = Emergence:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -0.996 3.32 87.7 -0.300  0.7648 

Season = Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   12.808 2.66 87.2  4.814  <.0001 

Season = Post_Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -2.734 2.96 89.4 -0.924  0.3581 

Results are averaged over the levels of: Sex 

Graphical Comparisons of seasons between the two populatins:

Figure 11 | Pairwise comparisons of each season between environments. Overlapping red bars indicate no statistical difference.

$emmeans
Environment = nonsubsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           18.86 2.25 88.4   14.383    23.34
 Emergence      3.33 2.24 88.7   -1.118     7.77
 Monsoon       21.85 2.03 87.5   17.811    25.89
 Post_Monsoon   2.36 2.36 87.0   -2.322     7.04

Environment = subsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           12.23 1.75 87.4    8.745    15.72
 Emergence      4.32 2.55 84.7   -0.741     9.39
 Monsoon        9.04 1.78 86.0    5.515    12.57
 Post_Monsoon   5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence            15.532 3.07 69.4  5.054  <.0001 
 Dry - Monsoon              -2.992 2.89 67.3 -1.036  0.7292 
 Dry - Post_Monsoon         16.500 3.24 78.9  5.098  <.0001 
 Emergence - Monsoon       -18.524 2.91 68.0 -6.361  <.0001 
 Emergence - Post_Monsoon    0.968 3.08 73.0  0.314  0.9891 
 Monsoon - Post_Monsoon     19.492 3.03 74.0  6.426  <.0001 

Environment = subsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence             7.907 3.11 88.6  2.543  0.0602 
 Dry - Monsoon               3.187 2.28 66.0  1.395  0.5070 
 Dry - Post_Monsoon          7.137 2.68 80.2  2.666  0.0450 
 Emergence - Monsoon        -4.720 3.20 89.6 -1.475  0.4569 
 Emergence - Post_Monsoon   -0.769 2.94 77.2 -0.262  0.9937 
 Monsoon - Post_Monsoon      3.951 2.78 84.9  1.421  0.4899 

Results are averaged over the levels of: Sex 
P value adjustment: tukey method for comparing a family of 4 estimates 

Graphical Comparisons between seasons within the two populations:

Figure 12 | Pairwise comparisons between seasons within each environment against estimated marginal means. Overlapping red bars indicate no statistical difference.

$emmeans
Season = Dry:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.92 2.19 47.2    2.523     11.3
 male    20.36 2.77 48.3   14.798     25.9

Season = Emergence:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.00 2.91 45.2   -0.853     10.9
 male     5.63 4.00 49.0   -2.403     13.7

Season = Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.27 2.34 46.2    1.560     11.0
 male    11.39 2.51 48.4    6.354     16.4

Season = Post_Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.94 2.09 47.9    1.738     10.1
 male     3.09 3.99 48.5   -4.937     11.1

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate   SE   df t.ratio p.value
 female - male  -13.441 3.68 47.2 -3.653  0.0006 

Season = Emergence:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -0.632 4.73 49.0 -0.134  0.8943 

Season = Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -5.121 3.53 47.1 -1.449  0.1539 

Season = Post_Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    2.847 4.36 48.9  0.652  0.5173 

Graphical Comparisons between sex within the subsidized population:

Table 7 | Mean individual seasonal home ranges pooled from the entire study period. Missing values are depicted where no locations for that animal during that period were successfull.

Seasonal Individual Home Ranges (MCP).
X Emergence X.1 X.2 Dry X.3 Monsoon X.4 Post.Monsoon X.5
Lizard Sex Area (ha) N Area N Area N Area N
M69 Male 0.33 4.00 36.73 24.00 14.84 22.00 0.07 8.00
M67 Male NA NA 5.71 9.00 7.72 7.00 NA NA
M255 Male 3.23 7.00 NA NA 1.07 9.00 NA NA
M215 Male 2.64 7.00 8.28 11.00 7.22 12.00 NA NA
M14 Male NA NA 6.20 15.00 7.50 10.00 NA NA
M119 Male NA NA 27.84 17.00 19.98 67.00 1.55 9.00
M112 Male NA NA 24.93 16.00 14.14 29.00 0.28 8.00
F66 Female 0.33 5.00 9.60 97.00 33.65 79.00 1.36 16.00
F36 Female 2.94 12.00 24.99 99.00 10.30 118.00 19.14 27.00
F252 Female 1.27 8.00 2.54 14.00 6.48 30.00 0.39 9.00
F214 Female NA NA 5.04 10.00 7.79 28.00 1.87 9.00
F200 Female NA NA 4.71 8.00 4.23 40.00 2.05 12.00
F147 Female 5.44 14.00 25.52 57.00 18.21 70.00 7.14 18.00
F146 Female NA NA 9.55 22.00 5.97 17.00 0.03 7.00
F137 Female 1.71 6.00 6.54 43.00 6.95 62.00 2.19 17.00
F135 Female NA N 3.71 25.00 5.72 48.00 0.68 5.00
F114 Female 0.99 12.00 13.66 99.00 10.72 84.00 4.56 24.00
F104 Female NA NA 6.07 70.00 7.59 49.00 0.53 13.00

Means Overall 1.89 13.04 10.56 2.99
Male 2.07 18.28 10.35 0.63
Female 2.11 10.18 10.69 3.63

$emmeans
Season = Dry:
 Sex    emmean   SE   df lower.CL upper.CL
 female  14.05 3.70 32.3     6.50    21.59
 male    21.97 3.95 32.7    13.93    30.02

Season = Emergence:
 Sex    emmean   SE   df lower.CL upper.CL
 female   4.64 3.10 31.5    -1.68    10.97
 male     1.34 3.24 32.1    -5.25     7.94

Season = Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female  22.14 3.01 31.1    16.00    28.28
 male    20.34 3.24 31.8    13.74    26.95

Season = Post_Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   2.96 4.76 32.0    -6.74    12.66
 male     2.80 4.35 33.0    -6.05    11.66

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -7.924 4.39 31.6 -1.803  0.0809 

Season = Emergence:
 contrast      estimate   SE   df t.ratio p.value
 female - male    3.302 4.44 31.6  0.744  0.4622 

Season = Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    1.799 4.02 30.5  0.447  0.6581 

Season = Post_Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    0.154 4.46 31.9  0.035  0.9726 

Graphical Comparisons between sex within the non-subsidized population:

Seasonal Home Range (KDE)

Table | Raw KDE group means of seasonal home ranges between sexes at Stone Canyon (subsidized).

Error in summarySE(season.kde, measurevar = "Home_Range_95kde", groupvars = c("Season",  : 
  could not find function "summarySE"
Error in summarySE(season.kde, measurevar = "Home_Range_95kde", groupvars = c("Season"),  : 
  could not find function "summarySE"

ANOVA Table. Seasonal KDE

Type III Analysis of Variance Table with Satterthwaite's method
            Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
Season     2654.14  884.71     3 39.026  4.5184 0.008181 **
Sex         179.65  179.65     1 25.426  0.9175 0.347144   
N            66.05   66.05     1 33.912  0.3373 0.565207   
Season:Sex 1743.14  581.05     3 36.391  2.9675 0.044584 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Raw Seasonal KDE Means

Adjusted Seasonal KDE Means

$emmeans
Season = Dry:
 Sex    emmean    SE   df lower.CL upper.CL
 female  19.99  4.91 41.5    10.09     29.9
 male    43.42  6.39 42.1    30.53     56.3

Season = Emergence:
 Sex    emmean    SE   df lower.CL upper.CL
 female  17.01  7.24 42.4     2.41     31.6
 male    17.58 15.47 43.6   -13.61     48.8

Season = Monsoon:
 Sex    emmean    SE   df lower.CL upper.CL
 female  19.94  5.25 40.8     9.33     30.6
 male    31.85  5.73 42.2    20.29     43.4

Season = Post_Monsoon:
 Sex    emmean    SE   df lower.CL upper.CL
 female  14.97  5.29 41.3     4.29     25.7
 male     2.65  9.13 43.3   -15.77     21.1

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate    SE   df t.ratio p.value
 female - male  -23.423  8.47 41.2 -2.765  0.0085 

Season = Emergence:
 contrast      estimate    SE   df t.ratio p.value
 female - male   -0.562 16.72 43.7 -0.034  0.9734 

Season = Monsoon:
 contrast      estimate    SE   df t.ratio p.value
 female - male  -11.912  8.07 41.2 -1.475  0.1477 

Season = Post_Monsoon:
 contrast      estimate    SE   df t.ratio p.value
 female - male   12.321 10.14 43.9  1.215  0.2308 

Home Range Overlap (MCP)

Gila Monster Home Range Overlap of 100% MCPs.

Figure 13 | Interactive map: Home Range overlap by sex of 100% MCPs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

The Stone Canyon population seems to exhibit greater female-female overlap as well as considerable overlap of male-female home ranges. There appears to be limited male-male overlap, with occurance happening in only two male-male home range polygons. This finding is in contrast to the Owl Head buttes study which revealed that there was a large degree of overlap among male-female and male-male overlaps (Table x). Gillardo concluded that, in their study, the high degree of overlap in males-males interactions may be due to having larger home ranges for mate searching activities. Males may have and increased home range size to maximize their access to multiple females. She concluded that the lack of female-female overlap may be due to smaller home range sizes.

At Stone Canyon, males have reduced home range sizes (Table 6; Fig. 4). However, males still retain home range overlap with multiple females while having reduced contact with other males. This may be in response to nutrient subsidies that reduce the need to have expanded home range sizes for foraging activities for both males and females. There may also be a higher density of females as a response to resource availability and reduced range requirements. Males are not forced to expand home ranges for mate searching to the extant that individuals at Owl Head Buttes may be subject to.

Table 8 | Home range overlap of Gila Monsters at the nutrient subsidized site. Male-male overlaps only occured between two pairs of males: M14-M69 and M119-M215 at 0.5 ha. and 19.5 ha. respectively and were therefore not included in the table.



Table: Home range overlap of Stone Canyon Gila Monsters using 100% MCPs.

ID              F36          F66    F104   F135   F137   F146   F147   X             M14           M67    M69    M112    M119    M215    M255 
--------------  -----------  -----  -----  -----  -----  -----  -----  ------------  ------------  -----  -----  ------  ------  ------  -----
Female:Female                                                          Male:Female                                                            
F36             _            5.13   _      _      _      4.65   _                    _             _      _      _       19.44   18.51   _    
F66             5.13         _      _      _      _      5.05   _                    _             _      2.6    _       _       _       _    
F104            _            _      _      0.5           _      _                    _             _      _      _       _       _       _    
F114            _            _      _      _      _      _      _                    _             _      _      5.82    _       _       _    
F135            _            _      0.5    _      2.89   _      3.94                 _             _      2.04   _       _       _       _    
F137            _            _      _      2.89   _      _      7.91                 _             _      0.55   _       _       _       _    
F146            4.65         5.05   _      _      _      _      _                    0.14          _      0.76   _       _       _       _    
F147            _            _      _      3.94   7.91   _      _                    3.73          0.21   4.6    _       _       _       _    
F200            _            _      _      _      _      _      _                    _             _      _      6.49    _       _       _    
F252            _            _      _      _      _      _      _                    _             _      _      _       _       _       3.45 
                                                                                                                                              
Mean =          4.3 ± 0.86                                             Mean =        5.26 ± 1.78                                              
                                                                                                                                              
                                                                                                                                              
ID              F36          F66    F104   F135   F137   F146   F147                 M14           M67    M69    M112    M119    M215    M255 
Female:Female                                                          Male:Female                                                            
Net             6.84         7.25   0.5    4.44   7.91   6.77   8.96                 3.87          0.21   8.57   12.31   21.24   20.32   3.45 
Prportion       0.2          0.2    0.1    0.5    1      0.7    0.3                  0.4           0.02   0.5    0.4     0.6     1       0.2  
Home Range Overlap Summary
Interaction N OL sd se ci
Female_Female 7 4.295714 2.271694 0.8586198 2.100967
Male_Female 13 5.256923 6.429806 1.7833074 3.885493
Male_Male 4 9.980000 10.958108 5.4790541 17.436795

Home Range Overlap (KDE)

Figure 14 | Interactive map: Home Range overlap by sex of 95% KDEs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

LS0tCnRpdGxlOiAiU3BhdGlhbCBFY29sb2d5IG9mIEdpbGEgTW9uc3RlcnMgaW4gYSBTdWJzaWRpemVkIFJlc291cmNlIEVudmlyb25tZW50IgphdXRob3I6ICJQaWVyc29uLCBNLlQuLCBHaWVuZ2VyLCBDLk0uLCBEZU5hcmRvLCBELkYuLCBQYXJrZXIsIE0uLCBHYWxsYXJkbywgTC4sIEdvb2RlLCBNLiwgR2VudHJ5LCBDLk0uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICBkZl9wcmludDogcGFnZWQKICByb3dzLnByaW50OiAxMAogIHRoZW1lOiBjb3NtbwogIGhpZ2hsaWdodDogYnJlZXplZGFyawogIG51bWJlcl9zZWN0aW9uczogeWVzCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICAgY29sbGFwc2VkOiBmYWxzZQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQpwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKZWRpdG9yX29wdGlvbnM6IApjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKaDEudGl0bGUgewogIGZvbnQtc2l6ZTogNDBweDsKICBmb250LWZhbWlseTogIkNhbGlicmkiLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICBjb2xvcjogRGFya0JsdWU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cjwvc3R5bGU+Cgo8YnI+CgojIEFCU1RSQUNUIApBbmltYWwgbW92ZW1lbnRzIGFyZSBvZnRlbiBkZWZpbmVkIHVzaW5nIHRoZSBob21lIHJhbmdlIGNvbmNlcHQuIENvbnNlcXVlbnRseSwgaG9tZSByYW5nZXMgYXJlIGRldGVybWluZWQgYnkgdGVtcG9yYWwsIHNwYXRpYWwsIGFuZCBpbmRpdmlkdWFsLWxldmVsIHByb2Nlc3Nlcy4gV2l0aGluIHRoZSBlbnZpcm9ubWVudCwgb25lIG9mIHRoZSBrZXkgZmFjdG9ycyBpbmZsdWVuY2luZyBhbiBhbmltYWzigJlzIHJhbmdlIGFuZCBob3cgaXQgdXNlcyB0aGUgZW52aXJvbm1lbnQgaXMgdGhhdCBvZiByZXNvdXJjZXMuIEFsdGVyYXRpb25zIHRvIHRoZSBlbnZpcm9ubWVudCB0aGF0IGFmZmVjdCByZXNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGF2YWlsYWJpbGl0eSBjYW4gaGF2ZSBwcm9mb3VuZCBjb25zZXF1ZW5jZXMgb24gYW4gYW5pbWFs4oCZcyBzcGF0aWFsIHBhdHRlcm5zLiBPbmUgb2YgdGhlIGJlc3QgZXhhbXBsZXMgb2YgdGhpcyBpcyB0aGF0IG9mIGdvbGYgY291cnNlcy4gQ2VydGFpbiBlbnZpcm9ubWVudGFsIG1vZGlmaWNhdGlvbnMgZXhoaWJpdGVkIGJ5IHNvbWUgaHVtYW4gYWx0ZXJlZCBlbnZpcm9ubWVudHMgY2FuIGhhdmUgcG9zaXRpdmUgZWZmZWN0cyBvbiBjZXJ0YWluIHdpbGRsaWZlIHNwZWNpZXMgYnkgYWx0ZXJpbmcgdGhlaXIgbW92ZW1lbnQgcGF0dGVybnMgYW5kIGZvcmFnaW5nIGVmZm9ydHMuIFdlIGFuYWx5emVkIGRhdGEgY29sbGVjdGVkIGZyb20gMjIgR2lsYSBNb25zdGVycyAqSGVsb2Rlcm1hIHN1c3BlY3R1bSogYXQgYSBzdWJzaWRpemVkIGVudmlyb25tZW50IGluIEFyaXpvbmEgZnJvbSAyMDA3IHRvIDIwMTMgYW5kIDE1IEdpbGEgTW9uc3RlcnMgZnJvbSBhIG5vbi1zdWJzaWRpemVkIGVudmlyb25tZW50IGZyb20gMjAwMCB0byAyMDAyLiBXZSBwZXJmb3JtZWQgYm90aCBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0aW9uIGFuZCBtaW5pbXVtIGNvbnZleCBwb2x5Z29ucyBmb3IgY29tcGFyYWJpbGl0eSBwdXJwb3Nlcy4gQWZ0ZXIgYWRqdXN0aW5nIGFyZWEgZXN0aW1hdGVzIGZvciBzZXgsIG51bWJlciBvZiBmaXhlcywgYW5kIHllYXIsIG1hbGVzIGluIHRoZSBzdWJzaWRpemVkIGVudmlyb25tZW50IGhhZCBhbiBhdmVyYWdlIG92ZXJhbGwgYXJlYSBvZiAxMy42IGhhIHdoaWxlIHRoZSBmZW1hbGVzIGhhZCBhbiBhcmVhIG9mIDguMyBoYS4gSW4gdGhlIHVuc3Vic2lkaXplZCBlbnZpcm9ubWVudCwgbWFsZXMgaGFkIGFuIGF2ZXJhZ2Ugb3ZlcmFsbCBhcmVhIG9mIDQzLjIgaGEgd2hpbGUgZmVtYWxlcyBoYWQgYW4gYXJlYSBvZiAyMy42IGhhLiBHaWxhIE1vbnN0ZXJzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMgYWxzbyBleGhpYml0ZWQgc2Vhc29uYWwgZGlmZmVyZW5jZXMsIHByaW1hcmlseSBpbiB0aGUgZHJ5IGFuZCBtb25zb29uIHNlYXNvbnMuIFRoZXJlIHdlcmUgYWxzbyBkaWZmZXJlbmNlcyBpbiBob21lIHJhbmdlIG92ZXJsYXAgd2l0aGluIGFuZCBiZXR3ZWVuIHNleGVzLiBJbiB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uLCB0aGVyZSB3YXMgdmVyeSBsaXR0bGUgbWFsZS1tYWxlIG92ZXJsYXAgd2l0aCBvbmx5IHR3byBvY2N1cmFuY2VzLCBtb3JlIGZlbWFsZS1mZW1hbGUgb3ZlcmxhcCBhbmQgbWFsZS1mZW1hbGUgb3ZlcmxhcCB3YXMgaW5jcmVhc2VkLiBNYWxlIGhvbWUgcmFuZ2VzIG9mdGVuIG92ZXJsYXBwZWQgc2V2ZXJhbCBmZW1hbGUgaG9tZSByYW5nZXMuIFRoaXMgc3VnZ2VzdHMgdGhhdCBHaWxhIG1vbnN0ZXIgaG9tZSByYW5nZXMgbWF5IGJlIHNtYWxsZXIgaW4gc3Vic2lkaXplZCByZXNvdXJjZSBlbnZpcm9ubWVudHMgdGhhbiB0aG9zZSBvZiB1bi1zdWJzaWRpemVkIGVudmlyb25tZW50cyBkdWUgdG8gaW5jcmVhc2VzIGluIGF2YWlsYWJsZSByZXNvdXJjZXMuCgo8YnI+CgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIExPQUQgUEFDS0FHRVMgCgpsaWJyYXJ5KHRpZHl2ZXJzZSkgCmxpYnJhcnkoa25pdHIpICMgIG1ha2UgdGFibGVzCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGdncGxvdDIpCiMgbGlicmFyeShkcGx5cikKbGlicmFyeShnZ2ZvcnRpZnkpCmxpYnJhcnkob3JkaW5hbCkKbGlicmFyeShsc21lYW5zKQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkobWFwdmlldykKbGlicmFyeShhZGVoYWJpdGF0SFIpCiMgbGlicmFyeShPcGVuU3RyZWV0TWFwKQpsaWJyYXJ5KGdnbWFwKQoja25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLzMpICNmb3JjZSBmaWd1cmVzIHRvIGJlIGNlcnRhaW4gc2l6ZSBhbmQgYXNwZWN0IHJhdGlvCmBgYAoKCgojIEdpbGEgTW9uc3RlcnMgKCpIZWxvZGVybWEgc3VzcGVjdHVtKikgYW5kIEh1bWFuIEFsdGVyZWQgRW52aXJvbm1lbnRzCjxwPgogIEFuaW1hbCBtb3ZlbWVudHMgYXJlIG9mdGVuIGRlZmluZWQgdXNpbmcgdGhlIGhvbWUgcmFuZ2UgY29uY2VwdC4gRm9ybWFsbHkgZGVmaW5lZCBieSBXaWxsaWFtIEJ1cmsgaW4gMTk0MyBhcywgInRoYXQgYXJlYSB0cmF2ZXJzZWQgYnkgdGhlIGluZGl2aWR1YWwgaW4gaXRzIG5vcm1hbCBhY3Rpdml0aWVzIG9mIGZvcmFnaW5nLCBtYXRpbmcsIGFuZCBjYXJpbmcgZm9yIHlvdW5nLiBPY2Nhc2lvbmFsIHNhbGxpZXMgb3V0c2lkZSB0aGUgYXJlYSwgcGVyaGFwcyBleHBsb3JhdG9yeSBpbiBuYXR1cmUsIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBob21lIHJhbmdlIi4gQ29uc2VxdWVudGx5LCBob21lIHJhbmdlcyBhcmUgZGV0ZXJtaW5lZCBieSB0ZW1wb3JhbCwgc3BhdGlhbCwgYW5kIGluZGl2aWR1YWwtbGV2ZWwgcHJvY2Vzc2VzLiBTdHVkeWluZyBhbmltYWwgSFLigJlzIGhhcyBiZWVuIG9mIHNwZWNpYWwgaW50ZXJlc3QgdG8gYSB3aWRlIHZhcmlldHkgb2YgcmVzZWFyY2hlcnMsIGluY2x1ZGluZyB0aG9zZSBzdHVkeWluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gYmVoYXZpb3IsIGFnZSwgc2V4LCBhbmQgc3BhY2luZyBwYXR0ZXJucywgcmVzb3VyY2UgZGlzdHJpYnV0aW9uIGFzIGl0IGFmZmVjdHMgc3BhY2UgdXNlLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWV0YWJvbGljIHJlcXVpcmVtZW50cyBhbmQgaG9tZSByYW5nZSBzaXplLCBhbmQgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBwdXJwb3NlcyBvZiBjb250cm9sbGluZyBwcm9ibGVtYXRpYyBzcGVjaWVzLCBjb25zZXJ2YXRpb24sIGFuZCB3aWxkbGlmZSBtYW5hZ2VtZW50LiAgCjxwPgogIFdpdGhpbiBhbiBhbmltYWxzIGVudmlyb25tZW50LCBvbmUgb2YgdGhlIGtleSBmYWN0b3JzIGluZmx1ZW5jaW5nIGFuIGFuaW1hbHMgcmFuZ2UgYW5kIGhvdyBpdCB1c2VzIHRoZSBlbnZpcm9ubWVudCBpcyB0aGF0IG9mIHJlc291cmNlcy4gIEFsdGVyYXRpb25zIHRvIHRoZSBlbnZpcm9ubWVudCB0aGF0IGFmZmVjdCByZXNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGF2YWlsYWJpbGl0eSBjYW4gaGF2ZSBwcm9mb3VuZCBjb25zZXF1ZW5jZXMgb24gYW4gYW5pbWFscyBzcGF0aWFsIHBhdHRlcm5zLiBTb21lIG9mIHRoZSBiZXN0IGV4YW1wbGVzIG9mIHRoaXMgYXJlIGFsdGVyYXRpb25zIGNhdXNlZCBieSBodW1hbiBhY3Rpdml0aWVzLiAgSGlzdG9yaWNhbGx5LCBodW1hbiBhbHRlcmF0aW9ucyB0byBlbnZpcm9ubWVudHMgaGF2ZSBiZWVuIHBlcmNpZXZlZCBhcyBoYXZpbmcgbmVnYXRpdmUgY29uc2VxdWVuY2VzIG9uIGxvY2FsIHdpbGRsaWZlIHBvcHVsYXRpb25zLiBIb3dldmVyLCBjZXJ0YWluIGVudmlyb25tZW50YWwgbW9kaWZpY2F0aW9ucyBjYW4gaGF2ZSBwb3NpdGl2ZSBlZmZlY3RzIG9uIHZhcmlvdXMgd2lsZGxpZmUgc3BlY2llcy4gVGhpcyBpcyBzZWVuIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGdvbGYgY291cnNlcywgYW5kIGdyZWVuIGFyZWFzLiBPbmUgb2YgdGhlIGtleSBjb25zZXF1ZW5jZXMgb2YgZ29sZiBjb3Vyc2VzLCBlc3BlY2lhbGx5IHRob3NlIHBsYWNlZCBpbiBkZXNlcnQgZW52aXJvbm1lbnRzIGlzIHRoZSB3YXRlciBpcnJpZ2F0aW9uIHN1cHBsZW1lbnRhdGlvbiBhbmQgaG9ydGljdWx0dXJlIHRoYXQgY29tZXMgd2l0aCB0aGVtLiBBcyBhIHJlc3VsdCwgdGhpcyBlbmhhbmNlcyBwcmltYXJ5IHByb2R1Y3Rpdml0eSB3aGljaCBpbmNyZWFzZXMgdGhlIHByZXNlbmNlIG9mIHZlcnRlYnJhdGUgYW5pbWFscyB0aGF0IHRha2UgYWR2YW50YWdlIG9mIHRoYXQgaW5jcmVhc2UgaW4gcHJvZHVjdGl2aXR5LiBJbiByZXB0aWxlcywgZmFzdGVyIGdyb3d0aCBpcyBvZnRlbiBjb3JyZWxhdGVkIHdpdGggaW5jcmVhc2VzIGluIHByZWNpcGl0YXRpb24gYW5kIGF2YWlsYWJsZSByZXNvdXJjZXMuIEEgUmVjZW50IHN0dWR5IGhhcyBzaG93biB0aGF0IEdpbGEgTW9uc3RlcnMgKkhlbG9kZXJtYSBzdXNwZWN0dW0qIGluaGFiaXRpbmcgYSBnb2xmIGNvdXJzZSBpbiB0aGUgdXBsYW5kIFNvbm9yYW4gb2YgQXJpem9uYSBncmV3IGxhcmdlciBhbmQgZmFzdGVyIHRoYW4gdW5zdWJzaWRpemVkIHBvcHVsYXRpb25zLgo8cD4KICBHaWxhIE1vbnN0ZXJzIG9jY3VweSB0aGUgaG90IGRlc2VydCByZWdpb25zIG9mIHRoZSBNb2hhdmUgRGVzZXJ0IGluIHRoZSBleHRyZW1lIHNvdXRoZWFzdGVybiAgTmV2YWRhLCBzb3V0aCB0aHJvdWdoIHRoZSBTb25vcmFuIERlc2VydCBvZiBBcml6b25hIGludG8gU29ub3JhIGFuZCBub3J0aGVybiBTaW5hbG9hLCBNZXhpY28uIEdpbGFzIGFyZSBrbm93biB0byBiZSDigJx3aWRlbHkgZm9yYWdpbmfigJ0gYW5pbWFscyBkdWUgdG8gdGhlaXIgc3BlY2lhbGl6YXRpb24gaW4gZmVlZGluZyBvbiB0aGUgeW91bmcgYW5kIGVnZ3Mgb2Ygc21hbGwgdmVydGVicmF0ZSBuZXN0cy4gVGhlc2UgY2hhcmFjdGVyaXN0aWNzIGFuZCBmaW5kaW5ncyBtYWtlIHRoaXMgc3BlY2llcyBhIGdvb2QgY2FuZGlkYXRlIGZvciBzdHVkeWluZyB0aGUgcG90ZW50aWFsIGFsdGVyYXRpb25zIHRvIGFuaW1hbCBob21lIHJhbmdlcyB0aGF0IG51dHJpZW50IHN1YnNpZGl6ZWQgYXJlYXMgc3VjaCBhcyBnb2xmIGNvdXJzZXMgbWF5IGhhdmUgb24gYW5pbWFsIHBvcHVsYXRpb25zLiAKPHA+CgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShkaXNtbykKbGlicmFyeShyZ2JpZikKbGlicmFyeSh1dGlscykKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoc3BvdGlmeXIpCmxpYnJhcnkoZ2dyaWRnZXMpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShyYXN0ZXJWaXMpCgojIyBVU0lORyBESVNNTzoKIyBleHRlbnQgPC0gZXh0ZW50KC0xMzAsLTcwLDIwLDYwKQoKSC5zdXNwIDwtIGdiaWYoImhlbG9kZXJtYSIsIHNwZWNpZXMgPSAic3VzcGVjdHVtIiwgZXh0ID0gZXh0ZW50LAogICAgICAgICAgICAgZ2VvID0gVFJVRSwgc3AgPSBUUlVFLCBkb3dubG9hZCA9IFRSVUUsCiAgICAgICAgICAgICByZW1vdmVaZXJvcyA9IFRSVUUpCgpILnN1c3BfeHkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BAY29vcmRzWywxXSxILnN1c3BAY29vcmRzWywyXSkpCmNvbG5hbWVzKEguc3VzcF94eSkgPC0gYygibG9uZ2l0dWRlIiwibGF0aXR1ZGUiKQoKIyB1cyA8LSBtYXBfZGF0YSgic3RhdGUiKQoKIyBnZ3Bsb3QoZGF0YSA9IEguc3VzcF94eSwgYWVzKHg9bG9uZ2l0dWRlLCB5PWxhdGl0dWRlKSkgKwojICAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1cywgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksCiMgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsKIyAgIGdlb21fcG9pbnQoKSArIHhsYWIoIkxvbmdpdHVkZSIpICsgeWxhYigiTGF0aXR1ZGUiKSArCiMgICBjb29yZF9maXhlZCh4bGltID0gYygtMTIwLC0xMDYpLCB5bGltID0gYygzMCw0MSkpCgojIyAgVVNJTkcgUkdCSUY6Ckguc3VzcF9sdSA8LSBuYW1lX2xvb2t1cChxdWVyeSA9ICdoZWxvZGVybWEgc3VzcGVjdHVtJywgcmV0dXJuID0gJ2RhdGEnKQoKSC5zdXNwX2NvZGUgPC0gcHJpbnQoYXMuaW50ZWdlcihuYW1lcyh3aGljaC5tYXgodGFibGUoSC5zdXNwX2x1JG51YktleSkpKSkpCgpvY2NfY291bnQodGF4b25LZXkgPSBILnN1c3BfY29kZSwgZ2VvcmVmZXJlbmNlZCA9IFRSVUUpCgp1c2EgPC0gaXNvY29kZXNbZ3JlcCgiVW5pdGVkIFN0YXRlcyIsIGlzb2NvZGVzJG5hbWUpLCAiY29kZSJdCm1leCA8LSBpc29jb2Rlc1tncmVwKCJNZXhpY28iLCBpc29jb2RlcyRuYW1lKSwgImNvZGUiXQoKSC5zdXNwX2RhdGEgPC0gb2NjX3NlYXJjaCh0YXhvbktleSA9IEguc3VzcF9jb2RlLCAKICAgICAgICAgICAgICAgICAgIHJldHVybiA9ICdkYXRhJywgCiAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gdXNhLAogICAgICAgICAgICAgICAgICAgaGFzQ29vcmRpbmF0ZSA9IFRSVUUpCgpILnN1c3BfZGF0YS5tZXggPC0gb2NjX3NlYXJjaCh0YXhvbktleSA9IEguc3VzcF9jb2RlLCAKICAgICAgICAgICAgICAgICAgIHJldHVybiA9ICdkYXRhJywgCiAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gbWV4LAogICAgICAgICAgICAgICAgICAgaGFzQ29vcmRpbmF0ZSA9IFRSVUUpCgpILnN1c3BfZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BfZGF0YSRVUyRzY2llbnRpZmljTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJGluc3RpdHV0aW9uQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJHN0YXRlUHJvdmluY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILnN1c3BfZGF0YSRVUyR2ZXJiYXRpbUxvY2FsaXR5KSkKCkguc3VzcF9kZi5tZXggPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BfZGF0YS5tZXgkc2NpZW50aWZpY05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILnN1c3BfZGF0YS5tZXgkaW5zdGl0dXRpb25Db2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSC5zdXNwX2RhdGEubWV4JHN0YXRlUHJvdmluY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILnN1c3BfZGF0YS5tZXgkdmVyYmF0aW1Mb2NhbGl0eSkpCgpILnN1c3BfZGYudXNtZXggPC0gYXMuZGF0YS5mcmFtZShyYmluZChILnN1c3BfZGYsSC5zdXNwX2RmLm1leCkpClZpZXcoSC5zdXNwX2RmLnVzbWV4KQoKY29vcmRzIDwtIGNiaW5kKHR5cGUuY29udmVydChILnN1c3BfZGF0YVtbIlVTIl1dW1siZGVjaW1hbExvbmdpdHVkZSJdXSwgYXMuaXMgPSBUUlVFKSwKICAgICAgICAgICAgICAgIHR5cGUuY29udmVydChILnN1c3BfZGF0YVtbIlVTIl1dW1siZGVjaW1hbExhdGl0dWRlIl1dLCBhcy5pcyA9IFRSVUUpKQoKY29vcmRzLm1leCA8LSBjYmluZCh0eXBlLmNvbnZlcnQoSC5zdXNwX2RhdGEubWV4W1siZGVjaW1hbExvbmdpdHVkZSJdXSwgYXMuaXMgPSBUUlVFKSwKICAgICAgICAgICAgICAgIHR5cGUuY29udmVydChILnN1c3BfZGF0YS5tZXhbWyJkZWNpbWFsTGF0aXR1ZGUiXV0sIGFzLmlzID0gVFJVRSkpCgpjb29yZHMgPC0gIHJiaW5kKGNvb3Jkcyxjb29yZHMubWV4KQpWaWV3KGNvb3JkcykKCkguc3VzcF9pbmZvIDwtIGNiaW5kKEguc3VzcF9kZi51c21leCxjb29yZHMpClZpZXcoSC5zdXNwX2luZm8pCmNvbG5hbWVzKEguc3VzcF9pbmZvKSA8LSBjKCJzcGVjaWVzIiwiZGF0YXNldCIsInN0YXRlIiwibG9jYXRpb24iLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIpCgp3b3JsZCA8LSBtYXBfZGF0YSgid29ybGQiKQpzdGF0ZXMgPC0gbWFwX2RhdGEoInN0YXRlIikKY291bnRpZXMgPC0gbWFwX2RhdGEoImNvdW50eSIpCgpjb3VudGllcyRwb2x5bmFtZSA8LSBwYXN0ZShjb3VudGllcyRyZWdpb24sIGNvdW50aWVzJHN1YnJlZ2lvbiwgc2VwID0gIiwiKQpjb3VudGllcyA8LSBjb3VudGllcyAlPiUgbGVmdF9qb2luKGZpcHMsIGJ5ID0gYygicG9seW5hbWUiID0gInBvbHluYW1lIikpCmNvdW50aWVzJGZpcHMgPC0gYXMuY2hhcmFjdGVyKGNvdW50aWVzJGZpcHMpCgpzb3V0aHdlc3Rlcm5fc3RhdGVzIDwtIHN1YnNldChzdGF0ZXMsIHJlZ2lvbiAlaW4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiYXJpem9uYSIsICJjYWxpZm9ybmlhIiwgInV0YWgiLCAibmV2YWRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgbWV4aWNvIiwgImNvbG9yYWRvIiwidGV4YXMiLCJva2xhaG9tYSIsImthbnNhcyIpKQoKc291dGh3ZXN0ZXJuX2NvdW50aWVzIDwtIHN1YnNldChjb3VudGllcywgcmVnaW9uICVpbiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImFyaXpvbmEiLCAiY2FsaWZvcm5pYSIsICJ1dGFoIiwgIm5ldmFkYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgbWV4aWNvIiwgImNvbG9yYWRvIiwidGV4YXMiLCJva2xhaG9tYSIsImthbnNhcyIpKQoKbGlicmFyeShyYXN0ZXIpCnByb3ZpbmNlcyA8LSBjKCJTb25vcmEiLCJTaW5hbG9hIikKCm1leGljbyA8LSBnZXREYXRhKCJHQURNIixjb3VudHJ5PSJNRVgiLGxldmVsPTEpCgptZXgucHJvdmluY2VzIDwtIG1leGljb1ttZXhpY28kTkFNRV8xICVpbiUgcHJvdmluY2VzLF0KCmdncGxvdChkYXRhID0gSC5zdXNwX2luZm8sIGFlcyh4PWxvbmdpdHVkZSwgeT1sYXRpdHVkZSkpICsgCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB3b3JsZCwgYWVzKHg9bG9uZyx5PWxhdCwgZ3JvdXA9Z3JvdXApLCBmaWxsID0gImdyYXkiLCBjb2xvciA9IndoaXRlIikrCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBzdGF0ZXMsIGFlcyh4PWxvbmcseT1sYXQsIGdyb3VwPWdyb3VwKSwgZmlsbCA9ICJncmF5IiwgY29sb3IgPSAid2hpdGUiKSsKICAjIGdlb21fcG9seWdvbihkYXRhID0gZmxfcG9seSwgYWVzKHg9bG9uZywgeT1sYXQsIGdyb3VwPWdyb3VwLCBmaWxsID0gZmlsbCkpICAKICBnZW9tX3BvbHlnb24oZGF0YSA9IHNvdXRod2VzdGVybl9zdGF0ZXMsIGFlcyh4PWxvbmcseT1sYXQsIGdyb3VwPWdyb3VwKSwgZmlsbCA9IE5BLAogICAgICAgICAgICAgICBjb2xvcj0id2hpdGUiKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBzb3V0aHdlc3Rlcm5fY291bnRpZXMsIGFlcyh4PWxvbmcseT1sYXQsIGdyb3VwPWdyb3VwKSwgZmlsbCA9IE5BLCAKICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4wNSkgKwogIGdlb21fcG9seWdvbihkYXRhPW1leC5wcm92aW5jZXMsIGFlcyh4PWxvbmcseT1sYXQsIGdyb3VwPWdyb3VwKSwgZmlsbCA9ICJncmF5IiwgCiAgICAgICAgICAgICAgIGNvbG9yID0id2hpdGUiKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzdGF0ZSksIHNpemU9MSkgKwogIGNvb3JkX21hcCgiY29uaWMiLCBsYXQwID0gMzAsIHhsaW09YygtMTE5LC05OCksIHlsaW09YygyMywzOCkpICsKICBzY2FsZV9maWxsX2lkZW50aXR5KCkgKwogIHRoZW1lX2dyZXkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSArIHRoZW1lKGxlZ2VuZC50aXRsZS5hbGlnbj0wLjUpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnZGVlcHNreWJsdWUnKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9IE5BKSkgKwogIGxhYnMoeCA9ICJMb25naXR1ZGUiLCB5ID0gIkxhdGl0dWRlIiwgCiAgICAgICB0aXRsZSA9ICJHaWxhIE1vbnN0ZXIgRGlzdHJpYnV0aW9uIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKQpgYGAKCjxicj4KCgoKIyBTdHVkeSBTaXRlCgogIEZvciB0aGUgc3Vic2lkaXplZCByZXNvdXJjZSBwb3B1bGF0aW9uIG9jY3VweWluZyBhIGh1bWFuIGFsdGVyZWQgZW52aXJvbm1lbnQsIHNwYXRpYWwgZGF0YSB3YXMgY29sbGVjdGVkIG9uIDIyIEdpbGEgTW9uc3RlcnMsIDEzIGZlbWFsZXMgYW5kIDkgbWFsZXMgYXQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiwgbG9jYXRlZCBpbiBQaW1hIENvdW50eSwgQXJpem9uYSBhdCB0aGUgYmFzZSBvZiB0aGUgVG9ydG9saXRhIE1vdW50YWlucy4gU3RvbmUgQ2FueW9uIGlzIGEgZ29sZiBjbHViIHdpdGggYW4gYXJlYSBvZiBhcHByb3hpbWF0ZWx5IDM0NSBoZWN0YXJlcywgY29uc2lzdGluZyBvZiB2ZWdldGF0aW9uIHRoYXQgaXMgdHlwaWNhbCBvZiBTb25vcmFuIGRlc2VydHNjcnViIGhhYml0YXQgb2YgdGhlIEFyaXpvbmEgdXBsYW5kcy4gRWxldmF0aW9uIHJhbmdlcyBmcm9tIDkwMG0tMTAwMG0sIHdpdGggdGhlIGxhbmRzY2FwZSBjb25zaXN0aW5nIG9mIGdyYW5pdGUgb3V0Y3JvcCBoaWxscyB3aXRoIGxhcmdlIGJvdWxkZXJzIHRocm91Z2hvdXQsIGludGVycnVwdGVkIGJ5IHdhdGVyZWQgZmFpcndheXMsIHBvbmRzIGFuZCBwYXZlZCBjYXJ0IHBhdGhzLiBUaGlzIGdvbGYgY291cnNlIHBvc3Nlc3NlcyBhIHBhcnRpYWxseSB1cmJhbml6ZWQgaG91c2luZyBkZXZlbG9wbWVudCB3aXRoIHByb3BlcnRpZXMgZW5jb21wYXNzaW5nIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIGNvdXJzZS4gCgogIDxicj4KCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgY2FjaGU9VFJVRX0KIyBnZ21hcDo6cmVnaXN0ZXJfZ29vZ2xlKGtleSA9ICJBSXphU3lCamhoRTlwZVJCbVMxaDlXWVF4MWs1TUZfWEFYcVVmU3MiKQojIAojIHAzPC0gZ2dtYXAoZ2V0X2dvb2dsZW1hcChjZW50ZXIgPSBjKGxvbiA9IC0xMTAuOTkwODgsIGxhdCA9IDMyLjQ2ODc4KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDE1LCBzY2FsZSA9IDIsbWFwdHlwZSA9J3NhdGVsbGl0ZScsYXJjaGl2aW5nID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAnY29sb3InKSkKIyAKIyBwMwoKTG9uZ2l0dWRlPC1jKC0xMTAuOTc4LC0xMTAuOTc4LC0xMTAuOTgwLC0xMTAuOTgzLC0xMTAuOTg1LC0xMTAuOTg4LC0xMTAuOTkwLC0xMTAuOTk0LC0xMTAuOTk1LAogICAgICAgICAgICAgLTExMC45OTcsLTExMS4wMDMsLTExMS4wMDQsLTExMS4wMDQyLC0xMTEuMDAwLC0xMTAuOTk1LC0xMTAuOTg1LC0xMTAuOTc4LC0xMTAuOTgpCgpMYXRpdHVkZTwtYygzMi40NjMsMzIuNDYyLDMyLjQ2MiwzMi40NjEsMzIuNDYxLDMyLjQ2MCwzMi40NjIsMzIuNDY0LDMyLjQ2NiwzMi40NjgsMzIuNDY4LAogICAgICAgICAgICAzMi40NjksMzIuNDczLDMyLjQ3MzMsMzIuNDcyLDMyLjQ3NCwzMi40NzEsMzIuNDY3KQoKbXljb29yZGRhdGEgPC0gYXMuZGF0YS5mcmFtZShjYmluZChMb25naXR1ZGUsTGF0aXR1ZGUpKQoKcDMrZ2VvbV9wb2x5Z29uKGRhdGE9bXljb29yZGRhdGEsYWVzKHg9TG9uZ2l0dWRlLHk9TGF0aXR1ZGUpLGFscGhhPTAuMixjb2xvdXI9InJlZCIsCiAgICAgICAgICAgICAgICBmaWxsPSJyZWQiKSsKICAjIGdlb21fcGF0aChkYXRhPW15Y29vcmRkYXRhLGFlcyh4PUxvbmdpdHVkZSx5PUxhdGl0dWRlKSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91cj0id2hpdGUiLGFscGhhPTAuNCxzaXplPTIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeD0tMTEwLjk4OSx5PTMyLjQ2OCxsYWJlbD0iU3RvbmUgQ2FueW9uIENsdWIiLGNvbG91cj0id2hpdGUiLHNpemU9MykrCiAgIyBzY2FsZWJhcih4Lm1pbiA9IC0xMTEuMDA1LCB4Lm1heCA9IC0xMTAuOTc1LAogICMgICAgICAgICB5Lm1pbiA9IDMyLjQ1NSwgeS5tYXggPSAzMi40ODAsIGFuY2hvciA9IE5VTEwsCiAgIyAgICAgICAgICBkaXN0ID0gNTAsIHRyYW5zZm9ybT1UUlVFLGRpc3RfdW5pdD0ibSIsIG1vZGVsID0gJ1dHUzg0JykrCiAgbGFicyh0aXRsZSA9ICJTdG9uZSBDYW55b24gU3R1ZHkgU2l0ZSBPcm8gVmFsbGV5IEFyaXpvbmEiKQpgYGAKRmlndXJlIDEgfCBTdG9uZSBDYW55b24gR29sZiBDbHViLCBsb2NhdGVkIGluIE9ybyBWYWxsZXksIEFyaXpvbmEgb24gdGhlIG5vcnRoZXJuIGVkZ2Ugb2YgVHVjc29uLCBBcml6b25hLgoKPGJyPgoKRm9yIHRoZSBjb21wYXJpc29uIHNpdGUsIHRoZSB1bnN1YnNpZGl6ZWQgbmF0dXJhbCBwb3B1bGF0aW9uIHdhcyByZXByZXNlbnRlZCB1c2luZyBzcGF0aWFsIGRhdGEgdGhhdCB3YXMgY29sbGVjdGVkIG9uIDE1IEdpbGEgTW9uc3RlcnMsIDYgbWFsZXMsIDYgZmVtYWxlcyBhbmQgMyBzdWItYWR1bHRzIGZyb20gMjAwMC0yMDAyIHVzaW5nIHJhZGlvLXRlbGVtZXRyeSBhdCBPd2wgSGVhZCBCdXR0ZXMsIEFyaXpvbmEuIExvY2F0ZWQgaW4gQXJpem9uYSB1cGxhbmQgU29ub3JhbiBEZXNlcnQgYXBwcm94aW1hdGVseSAxOSBrbSBub3J0aCBub3J0aGVhc3Qgb2YgU3RvbmUgQ2FueW9uLCB0aGUgT3dsIEhlYWQgQnV0dGVzIHN0dWR5IHNpdGUgd2FzIGFuIGFyZWEgb2YgYXBwcm94aW1hdGVseSAyMDAgaGVjdGFyZXMsIHdpdGggYW4gZWxldmF0aW9uIHJhbmdlIG9mIDgwMG0tOTAwbSwgYW5kIGRpc2NvbnRpbnVvdXMgc291dGhlcm4gYnV0dGVzIG9mIHJvY2t5IG91dGNyb3BzLiBPd2wgSGVhZCBoYXJib3JzIG5vIHVyYmFuaXplZCBkZXZlbG9wbWVudCBvciBvdGhlciBodW1hbiBhbHRlcmVkIGVudmlyb25tZW50cyBhc2lkZSBmcm9tIGhpZ2hseSBzcGFjZWQgdW5wYXZlZCBkaXJ0IGFjY2VzcyByb2FkcyB0aHJvdWdob3V0IHRoZSBzdXJyb3VuZGluZyBhcmVhLiAKCjxicj4KCmBgYHtyfQpBbGwuR2lsYXMgPC0gcmVhZF9jc3YoIi4vR01fRmluYWxfRGF0YS5jc3YiKQoKdXRtX3BvaW50cyA8LSBjYmluZChBbGwuR2lsYXMkRUFTVElORywgQWxsLkdpbGFzJE5PUlRISU5HKQoKdXRtX2xvY2F0aW9ucyA8LSBTcGF0aWFsUG9pbnRzKHV0bV9wb2ludHMsIHByb2o0c3RyaW5nPUNSUy5TQykKCnByb2pfbGF0LmxvbiA8LSBhcy5kYXRhLmZyYW1lKHNwVHJhbnNmb3JtKHV0bV9sb2NhdGlvbnMsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkpCmNvbG5hbWVzKHByb2pfbGF0LmxvbikgPC0gYygieCIsInkiKQoKIyMgRk9SVElHWSBTUEFUSUFMIFNQQVRJQUwgUE9JTlRTIEZPUiBQTE9UVElORzoKcHJval9sYXQubG9uIDwtIGZvcnRpZnkocHJval9sYXQubG9uLCByZWdpb24gPSAiVHlwZSIpCgpteU1hcCA8LSBnZXRfc3RhbWVubWFwKGJib3ggPSBjKGxlZnQgPSAtMTExLjAwOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSAzMi40NTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAtMTEwLjk2OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSAzMi40NzQpLAogICAgICAgICAgICAgICAgICAgICAgIG1hcHR5cGUgPSAidGVycmFpbiIsIAogICAgICAgICAgICAgICAgICAgICAgIGNyb3AgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gMTUpCgpnZ21hcChteU1hcCkrZ2VvbV9wb2ludChkYXRhPXByb2pfbGF0LmxvbiwgYWVzKHg9eCwgeT15KSwgc2l6ZT0wLjMpCmBgYAoKCgoKCmBgYHtyIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpiaW9jbGltIDwtIGdldERhdGEobmFtZSA9ICJ3b3JsZGNsaW0iLCByZXMgPSAyLjUsIHZhciA9ICJiaW8iLCBwYXRoID0gIi4vRGF0YS8iKQoKbmFtZXMoYmlvY2xpbSkgPC0gYygiQW5uIE1lYW4gVGVtcCIsIk1lYW4gRGl1cm5hbCBSYW5nZSIsIklzb3RoZXJtYWxpdHkiLAogICAgICAgICAgICAgICAgICAgICJUZW1wZXJhdHVyZSBTZWFzb25hbGl0eSIsIk1heCBUZW1wIFdhcm1lc3QgTW8iLCJNaW4gVGVtcCBDb2xkZXN0IE1vIiwKICAgICAgICAgICAgICAgICAgICAiQW5uIFRlbXAgUmFuZ2UiLCJNZWFuIFRlbXAgV2V0dGVzdCBRdHIiLCJNZWFuIFRlbXAgRHJpZXN0IFF0ciIsCiAgICAgICAgICAgICAgICAgICAgIk1lYW4gVGVtcCBXYXJtZXN0IFF0ciIsIk1lYW4gVGVtcCBDb2xkZXN0IFF0ciIsIkFubnVhbCBQcmVjaXAiLAogICAgICAgICAgICAgICAgICAgICJQcmVjaXAgV2V0dGVzdCBNbyIsIlByZWNpcCBEcmllc3QgTW8iLCJQcmVjaXAgU2Vhc29uYWxpdHkiLAogICAgICAgICAgICAgICAgICAgICJQcmVjaXAgV2V0dGVzdCBRdHIiLCJQcmVjaXAgRHJpZXN0IFF0ciIsIlByZWNpcCBXYXJtZXN0IFF0ciIsCiAgICAgICAgICAgICAgICAgICAgIlByZWNpcCBDb2xkZXN0IFF0ciIpCgojIGJpb19leHRlbnQgPC0gZXh0ZW50KHggPSBjKAojICAgbWluKEguc3VzcF94eSRsb25naXR1ZGUpLAojICAgbWF4KEguc3VzcF94eSRsb25naXR1ZGUpLAojICAgbWluKEguc3VzcF94eSRsYXRpdHVkZSksCiMgICBtYXgoSC5zdXNwX3h5JGxhdGl0dWRlKSkpCgpiaW9fZXh0ZW50IDwtIGV4dGVudCh4ID0gYygKICBtaW4oLTExOCksCiAgbWF4KC0xMDUpLAogIG1pbigzMCksCiAgbWF4KDQwKSkpCgoKYmlvY2xpbV9leHRlbnQgPC0gY3JvcCh4ID0gYmlvY2xpbSwgeSA9IGJpb19leHRlbnQpCmJpb2NsaW1fbW9kZWwgPC0gYmlvY2xpbSh4ID0gYmlvY2xpbV9leHRlbnQsIHAgPSBILnN1c3BfeHkpCnByZXNlbmNlX21vZGVsIDwtIGRpc21vOjpwcmVkaWN0KG9iamVjdCA9IGJpb2NsaW1fbW9kZWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gYmlvY2xpbV9leHRlbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBiaW9fZXh0ZW50KQoKIyBILnN1c3BfaW5mbwpncGxvdChwcmVzZW5jZV9tb2RlbCkgKyAKICBnZW9tX3Jhc3RlcihhZXMoZmlsbD12YWx1ZSkpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzLCBhZXMoeD0gbG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSwgY29sb3I9ImJsYWNrIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IEguc3VzcF9pbmZvLCBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlKSwgY29sb3IgPSAiYmxhY2siLCAKICAgICAgICAgICAgIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3Vycz1jKCJicm93biIsInllbGxvdyIsImRhcmtncmVlbiIpLCAiUHJvYmFiaWxpdHkiKSArCiAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTExNywtMTA2KSwgeWxpbSA9IGMoMzEsMzkpKSArCiAgeGxhYigiTG9uZ2l0dWRlIikgKyB5bGFiKCJMYXRpdHVkZSIpICsgZ2d0aXRsZSgiUHJvYmFiaWxpdHkgb2YgR2lsYSBNb25zdGVyIE9jY3VycmVuY2UiKSArIAogIHRoZW1lX2J3KCkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgoKCgoKIyBPdmVyYWxsIFllYXJseSBIb21lIFJhbmdlcyAoTUNQKQoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlN1bW1hcnkgb2YgaG9tZSByYW5nZSBzaXplLjwvc3Bhbj4KCmBgYHtyIEhvbWUgcmFuZ2Ugc2l6ZXMgb2YgU3RvbmUgQ2FueW9uIGFuZCBPd2wgSGVhZCBCdXR0ZXMgYnkgeWVhci4sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkdNX3RhYmxlIDwtIHJlYWRfY3N2KCJHTV90YWJsZS5jc3YiKQprYWJsZShHTV90YWJsZSxmb3JtYXQ9InBhbmRvYyIsIGNhcHRpb249J1RhYmxlIDEgfCBQb29sZWQgb3ZlcmFsbCBob21lIHJhbmdlcyBvZiBHaWxhIE1vbnN0ZXJzIGF0IE93bCBIZWFkIEJ1dHRlcyBhbmQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1Yi4gQm90aCAxMDAlIGFuZCA5NSUgTUNQcyB3ZXJlIGNhbGN1bGF0ZWQgYmV0d2VlbiBib3RoIHBvcHVsYXRpb25zLicpCmBgYAoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KFJtaXNjKQpNZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKE1lYW5zLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdPdmVyYWxsIGNvbWJpbmVkIDEwMCUgTUNQIG1lYW5zIGF2ZXJhZ2VkIGFjcm9zcyBzZXgnKQpgYGAKCgoKCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+R2lsYSBNb25zdGVyIEhvbWUgUmFuZ2UgU2l6ZXMgYXQgU3RvbmUgQ2FueW9uIHZzLiBPd2wgSGVhZCBCdXR0ZXMuPC9zcGFuPgoKCmBgYHtyIFN0b25lIENhbnlvbiBWcy4gT3dsIEhlYWQgQnV0dGVzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp5ZWFyIDwtIHJlYWRfY3N2KCJHTV9Db25zb2xpZGF0ZWRfQnlZZWFyLmNzdiIpCgojIHF1aWNrIHBsb3QKR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3AsZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gMikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKSsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIkFyZWEgKGhhKSB1c2luZyAxMDAlIE1DUCIpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsc2U9RkFMU0UpKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgMiB8IE5vbi1TdWJzaWRpemVkIChPd2wgSGVhZCBCdXR0ZXMpIHZzLiBTdWJzaWRpemVkIChTdG9uZSBDYW55b24pIHBvcHVsYXRpb24gMTAwJSBNQ1BzIGFnYWluc3QgbnVtYmVyIFxuIG9mIGZpeGVzIG9mIHRoZSBjb21wbGV0ZSBkYXRhIHNldC4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQogICMgdGhlbWVfYncoKQoKR3JhcGgxPC1HcmFwaDErdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCiMgbGVnZW5kIGF0IHRvcC1sZWZ0LCBpbnNpZGUgdGhlIHBsb3QKU0NPSC5oci5maWc8LUdyYXBoMSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKU0NPSC5oci5maWcKIyBkaXIuY3JlYXRlKCJvdXRwdXRzIikgIyBjcmVhdGUgYSBuZXcgZm9sZGVyIHRvIGhvbGQgdGhlIG91dHB1dCBmaWxlcwojIGdnc2F2ZSgib3V0cHV0cy9TQ19PSEJfcGxvdC5wZGYiKQpgYGAKCjxicj4KCgpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBtY3BfYW5hbHlzaXMgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAgbWNwLm91dCA8LSBtY3AoeHksIHBlcmNlbnRhZ2UsIHVub3V0PSJoYSIpCiMgICBhcmVhIDwtIGFzLmRhdGEuZnJhbWUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsNCkpCiMgICAucm93TmFtZXNERihhcmVhLCBtYWtlLm5hbWVzPVRSVUUpIDwtIGRhdGEkWUVBUgojICAgd3JpdGUudGFibGUoYXJlYSxmaWxlPSJNQ1BfSGVjdGFyZXMuY3N2IiwKIyAgICAgICAgICAgICAgIGFwcGVuZD1UUlVFLHNlcD0iLCIsIGNvbC5uYW1lcz1GQUxTRSwgcm93Lm5hbWVzPVRSVUUpCiMgICBtY3AucG9pbnRzIDwtIGNiaW5kKChkYXRhLmZyYW1lKHh5KSksZGF0YSRZRUFSKQojICAgY29sbmFtZXMobWNwLnBvaW50cykgPC0gYygieCIsInkiLCAieWVhciIpCiMgICBtY3AucG9seSA8LSBmb3J0aWZ5KG1jcC5vdXQsIHJlZ2lvbiA9ICJpZCIpCiMgICB1bml0cyA8LSBncmlkLnRleHQocGFzdGUocm91bmQobWNwLm91dEBkYXRhJGFyZWEsMiksIiBoYSIpLCB4PTAuOSwgIHk9MC45NSwKIyAgICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRmYWNlPTQsIGNleD0wLjkpLCBkcmF3ID0gRkFMU0UpCiMgICBtY3AucGxvdCA8LSBnZ3Bsb3QoKSArCiMgICAgIGdlb21fcG9seWdvbihkYXRhPW1jcC5wb2x5LCBhZXMoeD1tY3AucG9seSRsb25nLCB5PW1jcC5wb2x5JGxhdCksIGFscGhhPTAuNSkgKwojICAgICBnZW9tX3BvaW50KGRhdGE9bWNwLnBvaW50cywgYWVzKHg9eCwgeT15KSkgKyB0aGVtZV9idygpICsKIyAgICAgbGFicyh4PSJFYXN0aW5nIChtKSIsIHk9Ik5vcnRoaW5nIChtKSIsIHRpdGxlPW1jcC5wb2ludHMkeWVhcikgKwojICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSkgKwojICAgICBhbm5vdGF0aW9uX2N1c3RvbSh1bml0cykKIyAgIG1jcC5wbG90CiMgfQoKYGBgCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoUm1pc2MpCllSX0dSUF9NZWFucyA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV8xMDBtY3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIAogICAgICBjYXB0aW9uID0gJ1RhYmxlIDIgfCBSYXcgZ3JvdXAgMTAwJSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LicpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CllSX0dSUF9NZWFuczk1IDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1bWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFuczk1LCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSAzIHwgUmF3IGdyb3VwIDk1JSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiByYXcgZGF0YSBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LicpCmBgYAoKCgoKCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+R2lsYSBNb25zdGVyIFllYXJseSBIb21lIFJhbmdlIFNoaWZ0cyBvZiAxMDAlIE1DUHMuPC9zcGFuPgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ1JTLlNDPC1DUlMoIitwcm9qPXV0bSArem9uZT0xMiArZWxscHM9V0dTODQgK3VuaXRzPW0gK25vX2RlZnMiKQoKbWNwX2FuYWx5c2lzLlBPTFkgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lLHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICBkYXRhLnNwIDwtIGRhdGFbLCBjKCJMSVpBUkROVU1CRVIiLCAiRUFTVElORyIsICJOT1JUSElORyIpXQogIGNvb3JkaW5hdGVzKGRhdGEuc3ApIDwtIGMoIkVBU1RJTkciLCAiTk9SVEhJTkciKQogIHByb2o0c3RyaW5nKGRhdGEuc3ApIDwtIENSUy5TQwogIG1jcF9vdXQgPC0gbWNwKGRhdGEuc3AsIHBlcmNlbnRhZ2UsIHVub3V0PSJoYSIpCn0KCk0yMTVfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuMTI8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTA0X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEwNC8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTA0LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMTE8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDEyIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjM2LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjY2LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuMDg8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuMDc8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvMjAwNyAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi8yMDA5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyLzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4wOTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTY5LzIwMTAgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCiMjIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyICpZRUFSKjoKRjEwNF9tY3AuMDhUIDwtIGZvcnRpZnkoRjEwNF9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYxMDRfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMDRfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4wOFQgPC0gZm9ydGlmeShGMTE0X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMDlUIDwtIGZvcnRpZnkoRjExNF9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjEwVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4xMVQgPC0gZm9ydGlmeShGMTE0X21jcC4xMSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMTJUIDwtIGZvcnRpZnkoRjExNF9tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxMzdfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC4xMFQgPC0gZm9ydGlmeShGMTM3X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuMTFUIDwtIGZvcnRpZnkoRjEzN19tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjA5VCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4xMFQgPC0gZm9ydGlmeShGMTQ3X21jcC4xMCwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMTFUIDwtIGZvcnRpZnkoRjE0N19tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjEyVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjEyLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjA4VCA8LSBmb3J0aWZ5KEYzNl9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMDlUIDwtIGZvcnRpZnkoRjM2X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjM2X21jcC4xMFQgPC0gZm9ydGlmeShGMzZfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjExVCA8LSBmb3J0aWZ5KEYzNl9tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMTJUIDwtIGZvcnRpZnkoRjM2X21jcC4xMiwgcmVnaW9uID0gImlkIikKRjY2X21jcC4wOFQgPC0gZm9ydGlmeShGNjZfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLjA5VCA8LSBmb3J0aWZ5KEY2Nl9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuMTBUIDwtIGZvcnRpZnkoRjY2X21jcC4xMCwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuMDhUIDwtIGZvcnRpZnkoTTExOV9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLjA5VCA8LSBmb3J0aWZ5KE0xMTlfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC4xMFQgPC0gZm9ydGlmeShNMTE5X21jcC4xMCwgcmVnaW9uID0gImlkIikKTTExMl9tY3AuMDdUIDwtIGZvcnRpZnkoTTExMl9tY3AuMDcsIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLjA5VCA8LSBmb3J0aWZ5KE0xMTJfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC4xMFQgPC0gZm9ydGlmeShNMTEyX21jcC4xMCwgcmVnaW9uID0gImlkIikKTTY5X21jcC4wOVQgPC0gZm9ydGlmeShNNjlfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpNNjlfbWNwLjEwVCA8LSBmb3J0aWZ5KE02OV9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLjExVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLjExLCByZWdpb24gPSAiaWQiKQpNMjE1X21jcC4xMlQgPC0gZm9ydGlmeShNMjE1X21jcC4xMiwgcmVnaW9uID0gImlkIikKCgptY3Auc2hpZnQuVEVTVDQgPC0gZ2dwbG90KCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMDRfbWNwLjA4VCwgYWVzKHg9RjEwNF9tY3AuMDhUJGxvbmcsIHk9RjEwNF9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEwNF9tY3AuMDlULCBhZXMoeD1GMTA0X21jcC4wOVQkbG9uZywgeT1GMTA0X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4wOFQsIGFlcyh4PUYxMTRfbWNwLjA4VCRsb25nLCB5PUYxMTRfbWNwLjA4VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjA5VCwgYWVzKHg9RjExNF9tY3AuMDlUJGxvbmcsIHk9RjExNF9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMTBULCBhZXMoeD1GMTE0X21jcC4xMFQkbG9uZywgeT1GMTE0X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4xMVQsIGFlcyh4PUYxMTRfbWNwLjExVCRsb25nLCB5PUYxMTRfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjEyVCwgYWVzKHg9RjExNF9tY3AuMTJUJGxvbmcsIHk9RjExNF9tY3AuMTJUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuMDlULCBhZXMoeD1GMTM3X21jcC4wOVQkbG9uZywgeT1GMTM3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC4xMFQsIGFlcyh4PUYxMzdfbWNwLjEwVCRsb25nLCB5PUYxMzdfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLjExVCwgYWVzKHg9RjEzN19tY3AuMTFUJGxvbmcsIHk9RjEzN19tY3AuMTFUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMDlULCBhZXMoeD1GMTQ3X21jcC4wOVQkbG9uZywgeT1GMTQ3X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTBULCBhZXMoeD1GMTQ3X21jcC4xMFQkbG9uZywgeT1GMTQ3X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTFULCBhZXMoeD1GMTQ3X21jcC4xMVQkbG9uZywgeT1GMTQ3X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuMTJULCBhZXMoeD1GMTQ3X21jcC4xMlQkbG9uZywgeT1GMTQ3X21jcC4xMlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC4wOFQsIGFlcyh4PUYzNl9tY3AuMDhUJGxvbmcsIHk9RjM2X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA5VCwgYWVzKHg9RjM2X21jcC4wOVQkbG9uZywgeT1GMzZfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuMTBULCBhZXMoeD1GMzZfbWNwLjEwVCRsb25nLCB5PUYzNl9tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC4xMVQsIGFlcyh4PUYzNl9tY3AuMTFUJGxvbmcsIHk9RjM2X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjEyVCwgYWVzKHg9RjM2X21jcC4xMlQkbG9uZywgeT1GMzZfbWNwLjEyVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuMDhULCBhZXMoeD1GNjZfbWNwLjA4VCRsb25nLCB5PUY2Nl9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC4wOVQsIGFlcyh4PUY2Nl9tY3AuMDlUJGxvbmcsIHk9RjY2X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLjEwVCwgYWVzKHg9RjY2X21jcC4xMFQkbG9uZywgeT1GNjZfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MSkgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTlfbWNwLjA4VCwgYWVzKHg9TTExOV9tY3AuMDhUJGxvbmcsIHk9TTExOV9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTE5X21jcC4wOVQsIGFlcyh4PU0xMTlfbWNwLjA5VCRsb25nLCB5PU0xMTlfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExOV9tY3AuMTBULCBhZXMoeD1NMTE5X21jcC4xMFQkbG9uZywgeT1NMTE5X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTJfbWNwLjA3VCwgYWVzKHg9TTExMl9tY3AuMDdUJGxvbmcsIHk9TTExMl9tY3AuMDdUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTEyX21jcC4wOVQsIGFlcyh4PU0xMTJfbWNwLjA5VCRsb25nLCB5PU0xMTJfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMTBULCBhZXMoeD1NMTEyX21jcC4xMFQkbG9uZywgeT1NMTEyX21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MykgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTY5X21jcC4wOVQsIGFlcyh4PU02OV9tY3AuMDlUJGxvbmcsIHk9TTY5X21jcC4wOVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPU02OV9tY3AuMTBULCBhZXMoeD1NNjlfbWNwLjEwVCRsb25nLCB5PU02OV9tY3AuMTBUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NMjE1X21jcC4xMVQsIGFlcyh4PU0yMTVfbWNwLjExVCRsb25nLCB5PU0yMTVfbWNwLjExVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTIxNV9tY3AuMTJULCBhZXMoeD1NMjE1X21jcC4xMlQkbG9uZywgeT1NMjE1X21jcC4xMlQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICB0aGVtZV9idygpICtsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIikgKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgNCAgfCAgWWVhcmx5IGhvbWUgcmFuZ2Ugc2hpZnRzIG9mIHN1Yi1zYW1wbGVkIGhvbWUgcmFuZ2VzIG9mIDggbGl6YXJkcywgYm90aCBtYWxlcyBhbmQgZmVtYWxlcy4gSG9tZSBcbiByYW5nZSBzaGlmdHMgYXBwZWFyIHRvIGJlIHJlbGF0aXZsZXkgc3RhYmxlIG92ZXIgc3R1ZHkgeWVhcnMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKQoKbWNwLnNoaWZ0LlRFU1Q0CmBgYAoKCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5SZXBlYXRlZCBtZWFzdXJlcyBBTk9WQSBmb3IgWWVhcmx5IEhvbWUgUmFuZ2VzLjwvc3Bhbj4KCmBgYHtyIFJNQU5PVkEgWUVBUkxZIE9WRVJBTEwgMTAwJU1DUCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgR2V0IHAtdmFsdWVzIGZyb20gbWl4ZWQgbW9kZWwgRiB2YWx1ZXM6CmxpYnJhcnkobG1lNCkKbGlicmFyeShyZWFkcikKeWVhciA8LSByZWFkX2NzdigiR01fQ29uc29saWRhdGVkX0J5WWVhci5jc3YiKQoKUk1tb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzEwMG1jcH5FbnZpcm9ubWVudCtZZWFyK1NleCtOMTAwK0Vudmlyb25tZW50KlNleCsKICAgICAgICAgICAgICAgICAgICgxfEdpbGEpLGRhdGEgPSB5ZWFyKQpzdW1tYXJ5KFJNbW9kLnllYXIpCmBgYAoKCgpBTk9WQSBUYWJsZTogMTAwJSBNQ1AKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYW5vdmEoUk1tb2QueWVhcikKYGBgCgoKCmBgYHtyIFJNQU5PVkEgWUVBUkxZIE9WRVJBTEwgOTUlIE1DUCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXI5NTwtbG1lcihIb21lX1JhbmdlXzk1bWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcjk1KQpgYGAKCgoKQU5PVkEgVGFibGU6IDk1JSBNQ1AKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmFub3ZhKFJNbW9kLnllYXI5NSkKYGBgCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApgYGB7ciBSYXcgYW5kIEVNTWVhbnMgb2YgWWVhcmx5IE92ZXJhbGwgMTAwJU1DUCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXIxMDA8LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgpSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNbW9kLnllYXIxMDAsIAogICAgICAgICAgICAgICAgICAgIH4gRW52aXJvbm1lbnQpCiMgUk0ubWFyZ2luYWwKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9zZXggPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9zZXggPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX3NleCkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCnlyLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fc2V4LCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIkFkanVzdGVkIEhvbWUgUmFuZ2VzIGJ5IFNleCBhbmQgUG9wdWxhdGlvbiAoMTAwJSBNQ1ApIikrCiAgeGxhYigiU2V4IikrCiAgeWxhYigiIikKICAjIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgNSAgfCAgQWRqdXN0ZWQgaG9tZSByYW5nZXMgdXNpbmcgMTAwJSBNQ1BzIGJldHdlZW4gc2V4ZXMgb2Ygbm9uLXN1YnNpZGl6ZWQgYW5kIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbnMuIFxuIEFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgeWVhciwgc2V4LCBhbmQgc2FtcGxlIHNpemUuIE1hbGUgaG9tZSByYW5nZXMgcmVtYWluZWQgc21hbGxlciB0aGFuIHRob3NlIG9mIGZlbWFsZXMgYXQgXG4gT3dsIEhlYWQgQnV0dGVzLiIpKwogICMgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSkKCiMgeXIubWVhbi5hZGo8LXlyLm1lYW4uYWRqICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyB5ci5tZWFuLmFkagojIHJtKExTTS5ZZWFySFIpCgpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjEpCgpSYXcuWWVhckhSPC1nZ3Bsb3QoWVJfR1JQX01lYW5zLCBhZXMoeD1TZXgseT1Ib21lX1JhbmdlXzEwMG1jcCxncm91cD1FbnZpcm9ubWVudCkpKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZmFjdG9yKEVudmlyb25tZW50KSksIHNpemUgPSAyLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC4xKSkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzEwMG1jcC1zZSwgeW1heD1Ib21lX1JhbmdlXzEwMG1jcCtzZSksCiAgICAgICAgICAgICAgICB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIk92ZXJhbGwgSG9tZSBSYW5nZXMgYnkgU2V4IGFuZCBQb3B1bGF0aW9uICgxMDAlIE1DUCkiKSsKICB4bGFiKCJTZXgiKSsKICB5bGFiKCIxMDAlIE1DUCBBcmVhIChoYSkiKQogICMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpKQogICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAzIHwgUmF3IG92ZXJhbGwgbWVhbiBob21lIHJhbmdlcyBiZXR3ZWVuIGVudmlyb25tZW50IGFuZCBzZXggdXNpbmcgMTAwJSBNQ1BzLiBOb3RlLCB0aGF0IGJlZm9yZSBhZGp1c3RlZCBcbiBob21lIHJhbmdlcywgbWFsZXMgZXhoaWJpdCBzbWFsbGVyIG92ZXJhbGwgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLCB0aGFuIG1hbGVzIG9mIE93bCBIZWFkIEJ1dHRlcy4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCgp5ci5tZWFuLnJhdzwtUmF3LlllYXJIUiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyB5ci5tZWFuLnJhdwoKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZ3JpZCkKCmdyaWQuYXJyYW5nZSh5ci5tZWFuLnJhdywgeXIubWVhbi5hZGosIG5yb3cgPSAxLCAgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0R3JvYigiRmlndXJlIHggfCBhLiBSYXcgZ3JvdXAgbWVhbnMgb2Ygb3ZlcmFsbCB5ZWFybHkgaG9tZSByYW5nZXMgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcy4gTm90ZSB0aGF0IHRoZSBtYWxlIFxuIGhvbWUgcmFuZ2Ugb2YgdGhlIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgZmVtYWxlIGhvbWUgcmFuZ2UgaW4gdGhlIG5vbi1zdWJzaWRpemVkIFxuIHBvcHVsYXRpb24uIGIuIEdyb3VwIG1lYW5zIG9mIGhvbWUgcmFuZ2VzIGFmdGVyIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgeWVhciwgc2V4LCBhbmQgc2FtcGxlIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9IDEsZm9udHNpemUgPSAxMCksaGp1c3QgPSAwLCB4ID0gMCkpCmBgYAoKCgoKClRhYmxlIDQuIERpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmthYmxlKHJlZl9kZlJNX3NleCwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgNC4gRGlyZWN0aW9uYWwgbWVhbnMgb2YgaG9tZSByYW5nZSBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCiAKICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApQb3N0LUhvYyBjb21wYXJpc29ucyBiZXR3ZWVuIHNleGVzIGFuZCBlbnZpcm9ubWVudDoKYGBge3IgQ29tcHMgZm9yIFNleCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXIuRW08LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKCiMgU2V4LmVtbS5vYSA8LSBlbW1lYW5zKFJNbW9kLnllYXIuRW0sIGMoIkVudmlyb25tZW50IiwiU2V4IikpCiMgcGFpcnMoU2V4LmVtbS5vYSkKCmVtbV9zLnQyIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBTZXggfCBFbnZpcm9ubWVudCkKZW1tX3MudDIKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggV2l0aGluIEVhY2ggRW52aXJvbm1lbnQ6CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQyLCBjb21wYXJpc29ucyA9IFRSVUUsIHhsYWIgPSAiTGVhc3QgU3F1YXJlIE1lYW4gKGhhKSIsIHlsYWIgPSAiRW52aXJvbm1lbnQiKQpgYGAKRmlndXJlIDYgfCBQYWlyd2lzZSBjb21wYXJpc29ucyBvZiBob21lIHJhbmdlIGJldHdlZW4gc2V4ZXMgd2l0aGluIGVhY2ggZW52aXJvbm1lbnQuIElmIHJlZCBhcnJvd3Mgb3ZlcmxhcCB0aG9zZSBvZiBvdGhlcnMsIHRoZW4gIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmVtbV9zLnQzIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNleCkKZW1tX3MudDMKYGBgCgoKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBvZiBTZXggYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zOgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KcGxvdChlbW1fcy50MywgY29tcGFyaXNvbnMgPSBUUlVFLCB4bGFiID0gIkxlYXN0IFNxdWFyZSBNZWFuIChoYSkiLCB5bGFiID0gIkVudmlyb25tZW50IikKYGBgCkZpZ3VyZSA3IHwgUGFpcndpc2UgY29tcGFyaXNvbnMgb2Ygc2V4IGJldHdlZW4gZW52aXJvbm1lbnRzLiBJZiByZWQgYXJyb3dzIG92ZXJsYXAgdGhvc2Ugb2Ygb3RoZXJzLCB0aGVuIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAogCiAKIAogCiAKIApBdCBTdG9uZSBDYW55b24sIG1hbGUgeWVhcmx5IGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDEuOTEgLSAyNS4xIGhhLCB3aXRoIGEgbWVhbiBvZiAxMS44IMKxIDEuNyBTLkUuIGhhICgxMDAlIE1DUCksIDkuMiDCsSAxLjMgUy5FLiBIYSAoOTUlIE1DUCkuIEZlbWFsZSBob21lIHJhbmdlcyByYW5nZWQgZnJvbSAyLjA2IOKAkyAzOC44MSBoYSBhbmQgYSBtZWFuIG9mIDkuOCDCsSAxLjEgUy5FLiBoYSAoMTAwJSBNQ1ApLCA3LjEgwrEgMC43IFMuRS4gaGEgKDk1JSBNQ1ApLiBNYWxlIEdpbGEgTW9uc3RlcnMgYXQgT3dsIGhlYWQgQnV0dGVzIGhhZCBob21lIHJhbmdlcyB0aGF0IHJhbmdlZCBmcm9tIDEwLjYg4oCTIDgyLjcgaGEgd2l0aCBhIG1lYW4gb2YgNDMuMiDCsSA1LjcgUy5FLiBoYSAoMTAwJSBNQ1ApLCA0MS45IMKxIDQuOSBTLkUuIGhhICg5NSUgTUNQKS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDcuMSDigJMgNDcuNiB3aXRoIGEgbWVhbiBvZiAyMi4wIMKxIDMuNyBTLkUuIGhhICgxMDAlIE1DUCksIDIwLjYgwrEgMi41IFMuRS4gaGEgKDk1JSBNQ1ApLiBJbiB0aGUgYW5hbHlzZXMgb2YgYm90aCBwb3B1bGF0aW9ucywgeWVhciBoYWQgbm8gZWZmZWN0IG9uIGhvbWUgcmFuZ2Ugc2l6ZXMgKEYgPSAwLjM4LCBQID0gMC41NCksIHdoaWxlIHRoZXJlIHdhcyBhIGRldGVjdGVkIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gaG9tZSByYW5nZXMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zIChGID0gOC4zNSwgUCA9IDAuMDA1KSwgYXMgd2VsbCBhcyBzZXggKEYgPSAxNi42OCwgUCA9IDAuMDAwNCkuIFBvc3QtSG9jIGFuYWx5c2VzIGJldHdlZW4gc2V4ZXMgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtYWxlIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMgKGRmID0gNjguMywgUCA9IDAuMDAxKS4gVGhlcmUgd2FzIGEgc2xpZ2h0IGRpZmZlcmVuY2Ugb2YgZmVtYWxlIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMsIGhvd2V2ZXIgaXQgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChkZiA9IDY4LjcsIFAgPSAwLjA3KS4gQXQgc3RvbmUgY2FueW9uIHRoZXJlIHdhcyBubyBtYWpvciBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGhvbWUgcmFuZ2VzIChkZiA9IDMxLjgsIFAgPSAwLjE2KSB3aXRoIG1hbGUgaG9tZSByYW5nZSBiZWluZyBvbmx5IDMlIGxhcmdlciB0aGFuIGZlbWFsZXMuIE1hbGVzIGF0IE93bCBIZWFkIEJ1dHRlcyBoYWQgYSA2NSUgbGFyZ2VyIGhvbWUgcmFuZ2UgdGhhbiBkaWQgZmVtYWxlcywgYW5kIHdhcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IChkZiA9IDMxLjMsIFAgPSAwLjAwMDMpLiBJbnRlcmVzdGluZ2x5LCBtYWxlcyBhdCBTdG9uZSBDYW55b24gaGFkIHNtYWxsZXIgaG9tZSByYW5nZXMgdGhhbiBkaWQgdGhlIGZlbWFsZXMgYXQgT3dsIEhlYWQgQnV0dGVzIChUYWJsZSB4KSBXaGVuIHVzaW5nIDk1JSBNQ1BzLCBtYWxlIGhvbWUgcmFuZ2VzIHJlZHVjZWQgYnkgMjUlIGFuZCBmZW1hbGUgcmFuZ2UgYnkgMzElLiBBdCBPd2wgSGVhZCBCdXR0ZXMsIEdpbGEgTW9uc3RlcnMgc2hvd2VkIGEgc2ltaWxhciBiZWhhdmlvciB3aXRoIG1hbGUgaG9tZSByYW5nZXMgcmVkdWNlZCBieSAyMCUgYW5kIGZlbWFsZSByYW5nZXMgcmVkdWNlZCBieSAyNiUgdXNpbmcgOTUlIE1DUHMuIAogIAogCiAKIAoKIAogCiMjIE92ZXJhbGwgWWVhcmx5IEhvbWUgUmFuZ2VzIChLREUpCgoKSG9tZSByYW5nZSBlc3RpbWF0aW9uIG9uIHRoZSBTdG9uZSBDYW55b24gR2lsYSBNb25zdGVycyB1c2luZyA5NSUgS0RFcyB3aXRoIGhyZWYgYmFuZHdpZHRoIHByb2R1Y2VkIG1hbGUgaG9tZSByYW5nZXMgcmFuZ2luZyBmcm9tIDE0LjUg4oCTIDU1LjMgaGEgd2l0aCBhIG1lYW4gb2YgMzUuMCDCsSAzLjMgUy5FLiBoYS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDEwLjEg4oCTIDQ3LjggaGEgd2l0aCBhIG1lYW4gb2YgMjIuOSDCsSAxLjggUy5FLiBLREUgZXN0aW1hdGVzIGZvciBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgd2VyZSA5NiUgYW5kIDgwJSBsYXJnZXIgdGhhbiBNQ1AgZXN0aW1hdGVzLiBSZXBlYXRlZCBNZWFzdXJlcyBhbmFseXNpcyBvZiBLREVzIHN1Z2dlc3RlZCB0aGF0IHRoZXJlIHdhcyBhIHNtYWxsIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uIChGID0gNS41NiwgUCA9IDAuMDA5KS4gWWVhciBkaWQgbm90IGhhdmUgYW4gZWZmZWN0IG9uIGhvbWUgcmFuZ2VzIChGID0gMC41NywgUCA9IDAuNDUpLiAKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KeWVhci5rZGU8LXJlYWRfY3N2KCd5ZWFybHkga2RlIHRhYmxlLmNzdicpCmthYmxlKHllYXIua2RlLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdZZWFybHkgS0RFIEhvbWUgUmFuZ2VzJykKYGBgCgoKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdWIgPC0gc3Vic2V0KHllYXIsIEVudmlyb25tZW50ID09ICJzdWJzaWRpemVkIikKCllSX0dSUF9NZWFucy5LREUgPC0gc3VtbWFyeVNFKHN1YiwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NWtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zLktERSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnVGFibGUgIHwgUmF3IEdyb3VwIDk1JSBLREUgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LicpCmBgYAogCgoKIAogCiAKIAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+UmVwZWF0ZWQgbWVhc3VyZXMgQU5PVkEgZm9yIEtERSBIb21lIFJhbmdlcy48L3NwYW4+CgpSZXBlYXRlZCBNZWFzdXJlIEFOT1ZBIGZvciA5NSUgS0RFIG92ZXJhbGwgaG9tZSByYW5nZXMKYGBge3IgUmVwZWF0ZWQgTWVhc3VyZXMgQU5PVkEgS0RFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKClJNLktERW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfOTVrZGV+WWVhcitTZXgrTisoMXxHaWxhKSxkYXRhID0gc3ViKQoKc3VtbWFyeShSTS5LREVtb2QueWVhcikKYGBgCiAKQU5PVkEgVGFibGUgZm9yIDk1JSBLREUgKHN1YnNpZGl6ZWQpCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5LREVtb2QueWVhcikKYGBgCgoKCgpSZXBlYXRlZCBNZWFzdXJlIEFOT1ZBIGZvciA1MCUgS0RFIG92ZXJhbGwgaG9tZSByYW5nZXMKYGBge3IgUmVwZWF0ZWQgTWVhc3VyZXMgQU5PVkE1MCUgS0RFLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKClJNLktERS41MC5tb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzUwa2RlflllYXIrU2V4K04rKDF8R2lsYSksZGF0YSA9IHN1YikKCnN1bW1hcnkoUk0uS0RFLjUwLm1vZC55ZWFyKQpgYGAKCgpBTk9WQSBUYWJsZSBmb3IgNTAlIEtERSAoc3Vic2lkaXplZCkKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmFub3ZhKFJNLktERS41MC5tb2QueWVhcikKYGBgCiAKIAoKIAogCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShncmlkKQoKUmF3LktERS5IUjwtZ2dwbG90KFlSX0dSUF9NZWFucy5LREUsIGFlcyh4PVNleCx5PUhvbWVfUmFuZ2VfOTVrZGUpKSsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSkpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV85NWtkZS1zZSwgeW1heD1Ib21lX1JhbmdlXzk1a2RlK3NlKSwKICAgICAgICAgICAgICAgIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogICMgZ2d0aXRsZSgiT3ZlcmFsbCBIb21lIFJhbmdlcyBieSBTZXggYW5kIFBvcHVsYXRpb24gKDEwMCUgTUNQKSIpKwogIHhsYWIoIlNleCIpKwogIHlsYWIoIjk1JSBLREUgQXJlYSAoaGEpIikrCiAgICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSA4ICB8ICBSYXcgOTUlIEtERSBob21lIHJhbmdlcyBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyBhdCBTdG9uZSBDYW55b24uIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSkKClJhdy5LREUuSFI8LVJhdy5LREUuSFIgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC45NSksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIikpCiMgUmF3LktERS5IUgoKUk0uS0RFbW9kLnllYXI8LWxtZXIoSG9tZV9SYW5nZV85NWtkZX5ZZWFyK1NleCtOKygxfEdpbGEpLGRhdGEgPSBzdWIpCgpLREUubWFyZ2luYWwgPC0gbHNtZWFucyhSTS5LREVtb2QueWVhciwgCiAgICAgICAgICAgICAgICAgICAgfiBTZXgpCiMgUk0ubWFyZ2luYWwKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9LREUgPC0gbHNtZWFucyhSTS5LREVtb2QueWVhciwgc3BlY3MgPSBjKCJTZXgiKSkKCiMgcmVmUk1fc2V4CnJlZl9kZlJNX0tERSA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkocmVmUk1fS0RFKSkKcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4xKQoKTFNNLktERS5IUjwtZ2dwbG90KHJlZl9kZlJNX0tERSwgYWVzKHg9U2V4LHk9bHNtZWFuKSkrCiAgZ2VvbV9wb2ludChzaXplID0gMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSkpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bHNtZWFuLVNFLCB5bWF4PWxzbWVhbitTRSksIHdpZHRoPS4xLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogICMgZ2d0aXRsZSgiQWRqdXN0ZWQgSG9tZSBSYW5nZXMgYnkgU2V4IGFuZCBQb3B1bGF0aW9uICgxMDAlIE1DUCkiKSsKICB4bGFiKCJTZXgiKSsKICB5bGFiKCIiKQogICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSA4ICB8ICBBZGp1c3RlZCA5NSUgS0RFIGhvbWUgcmFuZ2VzIGJldHdlZW4gbWFsZSBhbmQgZmVtYWwgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLiBBZGp1c3RlZCBvbiB5ZWFyLCBcbiBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCiAgIyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBjb2xvcj0iYmxhY2siLCBzaXplPTE0LCBmYWNlPSJib2xkIikpCgojIExTTS5LREUuSFI8LUxTTS5LREUuSFIgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj1jKDAuMDUsIDAuOTUpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpKQojIExTTS5LREUuSFIKCmdyaWQuYXJyYW5nZShSYXcuS0RFLkhSLCBMU00uS0RFLkhSLCBucm93ID0gMSwgIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dEdyb2IoIkZpZ3VyZSB4IHwgYS4gUmF3IGdyb3VwIG1lYW5zIG9mIG92ZXJhbGwgeWVhcmx5IDk1JSBLREVzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMgYXQgU3RvbmUgQ2FueW9uLiBcbiBiLiBBZGp1c3RlZCA5NSUgS0RFcyBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgIHllYXIsIHNleCwgYW5kIHNhbXBsZSBzaXplLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhY2UgPSAxLGZvbnRzaXplID0gMTApLGhqdXN0ID0gMCwgeCA9IDApKQpgYGAKCiAKIAogCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprYWJsZShyZWZfZGZSTV9LREUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1RhYmxlICB8IERpcmVjdGlvbmFsIG1lYW5zIG9mIEtERSBob21lIHJhbmdlcyBhZnRlciBiZWluZyBhZGp1c3RlZCBmb3IgeWVhciwgc2V4IGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKIAogCgoKCgogCiAKIAogCiMgU2Vhc29uYWwgSG9tZSBSYW5nZQogCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5TZWFzb25hbCBIb21lIFJhbmdlLjwvc3Bhbj4KCgpIb21lIHJhbmdlIGFuYWx5c2lzIGJyb2tlbiBkb3duIGJ5IGZpdmUgc2Vhc29uczsgRW1lcmdlbmNlLCBEcnksIE1vbnNvb24sIFBvc3QgTW9uc29vbi4gVGhlIHN0YXJ0IG9mIGVtZXJnZW5jZSB3YXMgZGVmaW5lZCBieSB3aGVuIG1vdmVtZW50IHBhdHRlcm5zIGluY3JlYXNlZCBmcm9tIG5vbmUvbWluaW1hbCB0byB0aGUgc3RhcnQgb2YgaGlnaCBhY3Rpdml0eS4gRWZmb3J0IHdhcyB0YWtlbiB0byBtYXRjaCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHRvIHRoZSBPd2wgSGVhZCBCdXR0ZXMgZW1lcmdlbmNlIGRhdGUgaW50ZXJ2YWwuIE1vbnNvb24gc2Vhc29uIHdhcyBhZGp1c3RlZCB1c2luZyBOT0FBIGNsaW1hdGUgZGF0YS4gVGhlIHN0YXJ0IG9mIHdhcyBkZWZpbmVkIHdoZW4gdGhlIG1lYW4gZGV3IHBvaW50IHRlbXBlcmF0dXJlcyBvZiB0aHJlZSBjb25zZWN1dGl2ZSBkYXlzIHdlcmUgZ3JlYXRlciB0aGFuIDU1IGRlZ3JlZXMuIAoKU2NhbGluZyBob21lIHJhbmdlIGFuYWx5c2VzIGJ5IHNlYXNvbmFsIGVzdGltYXRlcyByZWR1Y2VzIHRoZSBudW1iZXIgb3IgbG9jYXRpb25zIGZvciBlYWNoIGxpemFyZC4gMTAwJSBNQ1BzIHdlcmUgdXNlZCBmb3Igc2Vhc29uYWwgaG9tZSByYW5nZSBhbmFseXNlcyB0byBhdm9pZCBhbnkgZnVydGhlciByZWR1Y3Rpb24gb2YgbG9jYXRpb25zIGZvciBlYWNoIGVzdGltYXRpb24uCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIENyZWF0ZSBNQ1AgcG9seWdvbnMgYnkgU0VBU09OOgpNMjE1X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMjE1X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKTTExMl9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyL0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCk0xMTlfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMTE0X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYxMzdfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjE0N19tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMjUyX21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMjUyX21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMjUyX21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYzNl9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YzNi9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YzNi9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YzNi9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYzNl9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YzNi9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkY2Nl9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0Y2Ni9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0Y2Ni9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjY2X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0Y2Ni9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkY2Nl9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0Y2Ni9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCiMjIEZvcnRpZnkgbWNwIHBvbHlnb25zIGZvciBnZ3Bsb3QyICpTRUFTT04qOgpNMjE1X21jcC5FTVQgPC0gZm9ydGlmeShNMjE1X21jcC5FTSwgcmVnaW9uID0gImlkIikKTTIxNV9tY3AuRFJZVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKTTIxNV9tY3AuTU9OVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKCk0xMTJfbWNwLkRSWVQgPC0gZm9ydGlmeShNMTEyX21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLk1PTlQgPC0gZm9ydGlmeShNMTEyX21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLlBNVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKTTExOV9tY3AuRFJZVCA8LSBmb3J0aWZ5KE0xMTlfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuTU9OVCA8LSBmb3J0aWZ5KE0xMTlfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuUE1UIDwtIGZvcnRpZnkoTTExOV9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGMTE0X21jcC5FTVQgPC0gZm9ydGlmeShGMTE0X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuRFJZVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuTU9OVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuUE1UIDwtIGZvcnRpZnkoRjExNF9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGMTM3X21jcC5FTVQgPC0gZm9ydGlmeShGMTM3X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuRFJZVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuTU9OVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuUE1UIDwtIGZvcnRpZnkoRjEzN19tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGMTQ3X21jcC5FTVQgPC0gZm9ydGlmeShGMTQ3X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuRFJZVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuTU9OVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuUE1UIDwtIGZvcnRpZnkoRjE0N19tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGMjUyX21jcC5FTVQgPC0gZm9ydGlmeShGMjUyX21jcC5FTSwgcmVnaW9uID0gImlkIikKRjI1Ml9tY3AuRFJZVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjI1Ml9tY3AuTU9OVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjI1Ml9tY3AuUE1UIDwtIGZvcnRpZnkoRjI1Ml9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgpGMzZfbWNwLkVNVCA8LSBmb3J0aWZ5KEYzNl9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuRFJZVCA8LSBmb3J0aWZ5KEYzNl9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLk1PTlQgPC0gZm9ydGlmeShGMzZfbWNwLk1PTiwgcmVnaW9uID0gImlkIikKRjM2X21jcC5QTVQgPC0gZm9ydGlmeShGMzZfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjY2X21jcC5FTVQgPC0gZm9ydGlmeShGNjZfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLkRSWVQgPC0gZm9ydGlmeShGNjZfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjY2X21jcC5NT05UIDwtIGZvcnRpZnkoRjY2X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuUE1UIDwtIGZvcnRpZnkoRjY2X21jcC5QTSwgcmVnaW9uID0gImlkIikKCm1jcC5zaGlmdC5URVNUNSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuRU1ULCBhZXMoeD1GMTE0X21jcC5FTVQkbG9uZywgeT1GMTE0X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLkRSWVQsIGFlcyh4PUYxMTRfbWNwLkRSWVQkbG9uZywgeT1GMTE0X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLk1PTlQsIGFlcyh4PUYxMTRfbWNwLk1PTlQkbG9uZywgeT1GMTE0X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuUE1ULCBhZXMoeD1GMTE0X21jcC5QTVQkbG9uZywgeT1GMTE0X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5FTVQsIGFlcyh4PUYxMzdfbWNwLkVNVCRsb25nLCB5PUYxMzdfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuRFJZVCwgYWVzKHg9RjEzN19tY3AuRFJZVCRsb25nLCB5PUYxMzdfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuTU9OVCwgYWVzKHg9RjEzN19tY3AuTU9OVCRsb25nLCB5PUYxMzdfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC5QTVQsIGFlcyh4PUYxMzdfbWNwLlBNVCRsb25nLCB5PUYxMzdfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLkVNVCwgYWVzKHg9RjE0N19tY3AuRU1UJGxvbmcsIHk9RjE0N19tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5EUllULCBhZXMoeD1GMTQ3X21jcC5EUllUJGxvbmcsIHk9RjE0N19tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5NT05ULCBhZXMoeD1GMTQ3X21jcC5NT05UJGxvbmcsIHk9RjE0N19tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxNDdfbWNwLlBNVCwgYWVzKHg9RjE0N19tY3AuUE1UJGxvbmcsIHk9RjE0N19tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMjUyX21jcC5FTVQsIGFlcyh4PUYyNTJfbWNwLkVNVCRsb25nLCB5PUYyNTJfbWNwLkVNVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0yKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMjUyX21jcC5EUllULCBhZXMoeD1GMjUyX21jcC5EUllUJGxvbmcsIHk9RjI1Ml9tY3AuRFJZVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMjUyX21jcC5NT05ULCBhZXMoeD1GMjUyX21jcC5NT05UJGxvbmcsIHk9RjI1Ml9tY3AuTU9OVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT00KSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1GMjUyX21jcC5QTVQsIGFlcyh4PUYyNTJfbWNwLlBNVCRsb25nLCB5PUYyNTJfbWNwLlBNVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5FTVQsIGFlcyh4PUYzNl9tY3AuRU1UJGxvbmcsIHk9RjM2X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuRFJZVCwgYWVzKHg9RjM2X21jcC5EUllUJGxvbmcsIHk9RjM2X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuTU9OVCwgYWVzKHg9RjM2X21jcC5NT05UJGxvbmcsIHk9RjM2X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC5QTVQsIGFlcyh4PUYzNl9tY3AuUE1UJGxvbmcsIHk9RjM2X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLkVNVCwgYWVzKHg9RjY2X21jcC5FTVQkbG9uZywgeT1GNjZfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5EUllULCBhZXMoeD1GNjZfbWNwLkRSWVQkbG9uZywgeT1GNjZfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5NT05ULCBhZXMoeD1GNjZfbWNwLk1PTlQkbG9uZywgeT1GNjZfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLlBNVCwgYWVzKHg9RjY2X21jcC5QTVQkbG9uZywgeT1GNjZfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoeD0iRWFzdGluZyAobSkiLCB5PSJOb3J0aGluZyAobSkiKSArCiAgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAgfCAgU2Vhc29uYWwgaG9tZSByYW5nZSBzaGlmdHMgb2YgZml2ZSBsaXphcmRzLiBFbWVyZ2VuY2UgYW5kIHBvc3QtbW9uc29vbiByYW5nZXMgc3RheSByZWFsYXRpdmVseSB3aXRoaW4gXG4gZWFjaCBvdGhlci4gQWxsIHNlYXNvbmFsIHBvbHlnb25zIHN0YXkgcmVsYXRpdmVseSBzdGFibGUgd2l0aG91dCBhbnkgbWFqb3Igc2hpZnRzIGF3YXkgZnJvbSBvdGhlciBzZWFzb25hbCByYW5nZXMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpCgptY3Auc2hpZnQuVEVTVDUKYGBgCgoKCgoKCgpTZWFzb25hbCBob21lIHJhbmdlcyBhdCBTdG9uZSBDYW55b24gdmFyaWVkIGluIHNpemUgYmV0d2VlbiBzZWFzb25zIGJ1dCBkaWQgbm90IHNlZW0gc2hpZnQgKEZpZy5fX18pLCB3aXRoIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIG92ZXJsYXBwaW5nIGVhY2ggb3RoZXIsIG9ubHkgZXhwYW5kaW5nIG9yIGNvbGxhcHNpbmcgYmV0d2VlbiBzZWFzb25zLiBIb21lIHJhbmdlIHBhdHRlcm5zIGF0IFN0b25lIENhbnlvbiBkaWQgbm90IGRpc3BsYXkgdGhlIHNhbWUgc2Vhc29uYWwgdmFyaWF0aW9uIGluIGhvbWUgcmFuZ2Ugc2l6ZXMgdGhhdCB3YXMgb2JzZXJ2ZWQgYXQgT3dsIEhlYWQgQnV0dGVzLiBBdCBTdG9uZSBDYW55b24sIEdpbGEgTW9uc3RlcnMgaGFkIHJlbGF0aXZlbHkgc21hbGxlciBob21lIHJhbmdlcyB0aHJvdWdob3V0IHRoZSB5ZWFyLCB3aGVyZSB0aGUgaGlnaGVzdCBpbmZsYXRpb24gb2YgcmFuZ2Ugc2l6ZSB3YXMgb2JzZXJ2ZWQgZHVyaW5nIHRoZSBkcnkgc2Vhc29uIGZyb20gYW4gaW5jcmVhc2UgaW4gbWFsZSBob21lIHJhbmdlcywgMTguMiDCsSA1LjQgUy5FLiBoYSB0byB0aGF0IG9mIGZlbWFsZSBob21lIHJhbmdlIHNpemVzIGF0IDEwLjEgwrEgMi40IFMuRS4gaGEuIEZlbWFsZXMgYXQgU3RvbmUgQ2FueW9uIGRpc3BsYXllZCBzaW1pbGFyIGhvbWUgcmFuZ2VzIGR1cmluZyB0aGUgbW9uc29vbiBzZWFzb24sIDEwLjYgwrEgMi41IFMuRS4gaGEuIEhvbWUgcmFuZ2Ugc2l6ZXMgYXQgT3dsIEhlYWQgQnV0dGVzIGhhZCBhIG11Y2ggbGFyZ2VyIGFtb3VudCBvZiB2YXJpYXRpb24gYWNyb3NzIHNlYXNvbnMgdGhhbiBkaWQgdGhvc2UgYXQgU3RvbmUgQ2FueW9uLiBUaGVyZSB3ZXJlIHN0aWxsIHNsaWdodGx5IGxhcmdlciByYW5nZXMgb2JzZXJ2ZWQgZHVyaW5nIHRoZSBkcnkgc2Vhc29uLCBwcmltYXJpbHkgZHVlIHRvIGluY3JlYXNlZCBob21lIHJhbmdlIHNpemVzIGV4aGliaXRlZCBieSBtYWxlcyAyOS40IMKxIDQuNyBTLkUuIGhhIHZlcnN1cyBmZW1hbGVzIGF0IDE1LjYgwrEgMy44IFMuRS4gaGEuIER1cmluZyB0aGUgbW9uc29vbiBzZWFzb24sIHRoZXJlIHdhcyBzdGlsbCB5ZXQgYSBsYXJnZSBpbmZsdXggb2YgaG9tZSByYW5nZXMgc2l6ZXMgd2hlcmUgZmVtYWxlIGhvbWUgcmFuZ2VzIGluY3JlYXNlZCB0byAyMi45IMKxIDQuMCBTLkUuIGhhLiAgRm9yIGJvdGggcG9wdWxhdGlvbnMsIGhvbWUgcmFuZ2VzIGR1cmluZyB0aGUgZW1lcmdlbmNlIGFuZCBwb3N0LW1vbnNvb24gc2Vhc29ucyB3ZXJlIHNtYWxsLCBtYXJraW5nIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiBvdmVyd2ludGVyaW5nIHBlcmlvZHMsIHdoZXJlIG1pbmltYWwgbW92ZW1lbnQgaXMgb2JzZXJ2ZWQgaW4gYm90aCBncm91cHMuIAogIApBbmFseXNpcyBpbmRpY2F0ZWQgdGhhdCB0aGVyZSB3YXMgYW4gZWZmZWN0IG9mIHNlYXNvbiAoZGYgPSAzLCBGID0gMTUuNDEsIFAgPSA8MC4wMDEpIGFzIHdlbGwgYXMgYW4gaW50ZXJhY3Rpb24gb2YgZW52aXJvbm1lbnQgYW5kIHNlYXNvbiAoZGYgPSAzLCBGID0gNi44NCwgUCA9IDwwLjAwMSksIGluZGljYXRpbmcgdGhhdCBjaGFuZ2VzIGluIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIHNpemVzIHZhcmllZCBiZXR3ZWVuIGVhY2ggZW52aXJvbm1lbnQuIFBvc3QtSG9jIGFuYWx5c2VzIG9uIHRoZSBTdG9uZSBDYW55b24gZGF0YSBzZXQgd2l0aCBob21lIHJhbmdlIG1lYW5zIGF2ZXJhZ2VkIGFjcm9zcyBzZXgsIHN1Z2dlc3RlZCB0aGF0IHRoZXJlIHdhcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIGVtZXJnZW5jZSAoNC4zMiDCsSAyLjU1IFMuRS4gaGEpIGFuZCBwb3N0LW1vbnNvb24gc2Vhc29ucyAoNS4wOSDCsSAyLjA3IFMuRS4gaGEpIG5vciBkcnkgYW5kIG1vbnNvb24gKDEyLjIzIMKxIDEuNzQgUy5FLiBoYSBhbmQgOS4wNCDCsSAxLjc4IFMuRS4gaGEpLiBUaGVyZSB3YXMgYWxzbyBubyBzaWduaWZpY2FuY2UgYmV0d2VlbiBlbWVyZ2VuY2UgYW5kIGRyeS9tb25zb29uIHNlYXNvbnMsIGJ1dCB0aGVyZSB3YXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gZHJ5IGFuZCBwb3N0LW1vbnNvb24gKGRmID0gODAuMiwgUCA9IDAuMDQpLiBQb3N0LUhvYyBhbmFseXNlcyBvbiB0aGUgT3dsIEhlYWQgQnV0dGVzIHBvcHVsYXRpb24gaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBlbWVyZ2VuY2UgKDMuMzMgwrEgMi4yNCBTLkUuIGhhKSBhbmQgcG9zdC1tb25zb29uICgyLjM2IMKxIDIuMzYgUy5FLikgbm9yIGRyeSBhbmQgbW9uc29vbiAoMTguODYgwrEgMi4yNSBTLkUuIGhhIGFuZCAyMS44NSDCsSAyLjAzIFMuRS4gaGEpIHJlZmxlY3RpbmcgdGhlIHNhbWUgcGF0dGVybiBhdCBTdG9uZSBDYW55b24uIEhvd2V2ZXIsIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBlbWVyZ2VuY2UgYW5kIGRyeS9tb25zb29uIChkZiA9IDY5LjQsIFAgPSA8MC4wMDAxLCBhbmQgZGYgPSA2OCwgUCA9IDwwLjAwMDEgcmVzcGVjdGl2ZWx5KSwgYXMgd2VsbCBhcyBwb3N0LW1vbnNvb24gYW5kIGRyeS9tb25zb29uIChkZiA9IDc4LjksIFAgPSA8MC4wMDAxLCBhbmQgZGYgPSA3NCwgUCA9IDwwLjAwMDEpLiBUaGlzIHNob3dzIGEgcmF0aGVyIGRpZmZlcmVudCBwYXR0ZXJuIHRoYW4gc2VlbiBhdCBTdG9uZSBDYW55b24uIFBhaXJ3aXNlIGFuYWx5c2VzIGJldHdlZW4gdGhlIHR3byBwb3B1bGF0aW9ucyBpbmRpY2F0ZWQgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGVtZXJnZW5jZSAoZGYgPSA4Ny43LCBQID0gMC43Nikgb3IgcG9zdC1tb25zb29uIChkZiA9IDg5LjQsIFAgPSAwLjM1KS4gRGlmZmVyZW5jZXMgaW4gaG9tZSByYW5nZSBzaXplcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMgd2VyZSBiZXR3ZWVuIHRoZSBkcnkgYW5kIG1vbnNvb24gc2Vhc29ucyAoRmlnLl9fXykuICBPd2wgSGVhZCBob21lIHJhbmdlcyB3ZXJlIDU4JSBsYXJnZXIgdGhhbiB0aG9zZSBhdCBTdG9uZSBDYW55b24gZHVyaW5nIHRoZSBkcnkgc2Vhc29uLCBhbmQgNzYlIGxhcmdlciBkdXJpbmcgdGhlIG1vbnNvb24gc2Vhc29uLiAKICAKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzZWFzb25hbDwtcmVhZC5jc3YoIlNDX1NlYXNvbmFsX0RhdGEuY3N2IikKCmxpYnJhcnkoUm1pc2MpCgpTRUFTX0dSUF9NZWFucyA8LSBzdW1tYXJ5U0Uoc2Vhc29uYWwsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfMTAwbWNwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX01lYW5zLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdUYWJsZSA1IHwgR3JvdXAgbWVhbnMgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiBTdG9uZSBDYW55b24gKHN1YnNpZGl6ZWQpIGFuZCBPd2wgSGVhZCBCdXR0ZXMgKG5vbi1zdWJzaWRpemVkKS4gVGhlc2UgbWVhbnMgYXJlIGF2ZXJhZ2VkIGFjcm9zcyBzZXguJykKYGBgCgoKCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobG1lclRlc3QpCiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQpzdW1tYXJ5KFJNLm1vZC5TZWFzb24pCgojIGFub3ZhKFJNLm1vZC5TZWFzb24pCgojICMgbWFyZ2luYWwuc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgCiMgIyAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyAjIG1hcmdpbmFsLnNlYXNvbgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5tb2QuU2Vhc29uKQpgYGAKCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClNFQVNfR1JQX1RFU1QgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX1RFU1QsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1RhYmxlIDYgfCBTZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkgcG9wdWF0aW9ucyBmb3IgbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXNlIGFyZSByYXcgbWVhbnMgYmVmb3JlIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgc2Vhc29uLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4nKQpgYGAKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgpwZCA8LSBwb3NpdGlvbl9kb2RnZSgwLjMpICMgbW92ZSB0aGVtIC4wNSB0byB0aGUgbGVmdCBhbmQgcmlnaHQgKCdkb2RnZXMnKQoKIyMgVEVTVCAzCnJhdy5zZWFzb25hbDwtZ2dwbG90KFNFQVNfR1JQX1RFU1QsYWVzKHg9RW52aXJvbm1lbnQsIHk9SG9tZV9SYW5nZV8xMDBtY3AsIHNoYXBlPVNleCkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2hhcGU9U2V4KSwgc2l6ZSA9IDIsIHBvc2l0aW9uPXBkKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzEwMG1jcC1zZSwgeW1heD1Ib21lX1JhbmdlXzEwMG1jcCtzZSksIHBvc2l0aW9uID0gcGQsCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKyAKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygnYmxhY2snLCdyZWQnKSkgKwogIGZhY2V0X2dyaWQoflNlYXNvbikgKwogICMgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoOCwxOSkpKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgIHwgIFJhdyBzZWFzb25hbCBtZWFucyBvZiBzZXhlcyBiZXR3ZWVuIGVhY2ggZW52aXJvbm1lbnQuIEhvbWUgcmFuZ2VzIG9mIHRoZSBzdWJzaWRlemVkIHBvcHVsYXRpb24gcmVtYWluIFxuIHJlbGF0aXZlbHkgc21hbGwgdGhyb3VnaG91dCB0aGUgc2Vhc29ucywgd2l0aCB0aGUgZXhjZXB0aW9uIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiB3aGVyZSB3ZSBvYnNlcnZlIGluY3JlYXNlZCBtYWxlIFxuIGhvbWUgcmFuZ2VzLiBUaGUgbm9uLXN1YnNpZGl6ZWQgcG9wdWxhdGlvbiBleGhpYml0cyBhIGxhcmdlIGFtb3VudCBvZiB2YXJpYXRpb24gYWNyb3NzIHNlYXNvbnMuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiAgIyBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCdFbWVyZ2VuY2UnLCdEcnknLCdNb25zb29uJywnUG9zdF9Nb25zb29uJykpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MS41LCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS41KSwgaGp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT04KSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiAgeGxhYigiRW52aXJvbm1lbnQiKSArIHlsYWIoIkFyZWEgKGhhKSB1c2luZyAxMDAlIE1DUCIpCnJhdy5zZWFzb25hbApgYGAKCgoKCgpBZGp1c3RlZCBTZWFzb25hbCBNZWFucwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIFJhdyBzZWFzb25hbCBtZWFucwojIHBkIDwtIHBvc2l0aW9uX2RvZGdlKDAuMykgIyBtb3ZlIHRoZW0gLjA1IHRvIHRoZSBsZWZ0IGFuZCByaWdodCAoJ2RvZGdlcycpCiMgCiMjIFRFU1QgMwojIHJhdy5zZWFzb25hbDwtZ2dwbG90KFNFQVNfR1JQX1RFU1QsYWVzKHg9RW52aXJvbm1lbnQsIHk9SG9tZV9SYW5nZV8xMDBtY3AsIHNoYXBlPVNleCkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSAyLCBwb3NpdGlvbj1wZCkgKwojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzEwMG1jcC1zZSwgeW1heD1Ib21lX1JhbmdlXzEwMG1jcCtzZSksIHBvc2l0aW9uID0gcGQsCiMgICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArCiMgICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygnYmxhY2snLCdyZWQnKSkgKwojICAgZmFjZXRfZ3JpZCh+U2Vhc29uKSArCiMgICAjICMgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoOCwxOSkpKwojICAgIyBsYWJzKGNhcHRpb24gPSAiRmlndXJlICB8ICBSYXcgc2Vhc29uYWwgbWVhbnMgb2Ygc2V4ZXMgYmV0d2VlbiBlYWNoIGVudmlyb25tZW50LiBIb21lIHJhbmdlcyBvZiB0aGUgc3Vic2lkZXplZCBwb3B1bGF0aW9uIHJlbWFpbiBcbiByZWxhdGl2ZWx5IHNtYWxsIHRocm91Z2hvdXQgdGhlIHNlYXNvbnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGRyeSBzZWFzb24gd2hlcmUgd2Ugb2JzZXJ2ZSBpbmNyZWFzZWQgbWFsZSBcbiBob21lIHJhbmdlcy4gVGhlIG5vbi1zdWJzaWRpemVkIHBvcHVsYXRpb24gZXhoaWJpdHMgYSBsYXJnZSBhbW91bnQgb2YgdmFyaWF0aW9uIGFjcm9zcyBzZWFzb25zLiIpKwojICAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkrCiMgICAjIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoJ0VtZXJnZW5jZScsJ0RyeScsJ01vbnNvb24nLCdQb3N0X01vbnNvb24nKSkgKwojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiMgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MS41LCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS41KSwgaGp1c3QgPSAwLjUpLAojICAgICAgICAgYXhpcy50ZXh0LnggID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT04KSwKIyAgICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiMgICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAojICAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKIyAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiMgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiMgICB4bGFiKCIiKSArIHlsYWIoIiIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgQWp1c3RlZCBzZWFzb25hbCBtZWFucwpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE9c2Vhc29uYWwpCgojIFJNLm1hcmdpbmFsIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgCiMgICAgICAgICAgICAgICAgICAgICB+IEVudmlyb25tZW50KQojIFJNLm1hcmdpbmFsCgojIyBDQVRBR09SSVpFIExTTSBHUkFQSCBCWSBTRVggQkVUV0VFTiBFTlZJUk9OTUVOVDoKcmVmUk1fc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgc3BlY3MgPSBjKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fc2Vhc29uIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9zZWFzb24pKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjIpCgphZGouc2Vhc29uYWw8LWdncGxvdChyZWZfZGZSTV9zZWFzb24sYWVzKHg9RW52aXJvbm1lbnQsIHk9bHNtZWFuLCBzaGFwZT1TZXgpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSAyLCBwb3NpdGlvbj1wZCwgc2hvdy5sZWdlbmQ9VFJVRSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bHNtZWFuLVNFLCB5bWF4PWxzbWVhbitTRSksIHBvc2l0aW9uID0gcGQsCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKyAKICBmYWNldF9ncmlkKH5TZWFzb24pICsKbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAgfCBBZGp1c3RlZCBzZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIG9mIHNleGVzIGJldHdlZW4gZW52aXJvbm1lbnRzLiBIb21lIHJhbmdlcyBvZiB0aGUgc3Vic2lkZXplZCBcbiBwb3B1bGF0aW9uIHJlbWFpbiByZWxhdGl2ZWx5IHNtYWxsIHRocm91Z2hvdXQgdGhlIHNlYXNvbnMuIEFmdGVyIGFkanVzdG1lbnQgbWFsZSBob21lIHJlYW5nZXMgd2VyZSByZWR1Y2VkLCBcbiBidXQgc3RpbGwgcmVtYWluZWQgc2xpZ2h0bHkgbGFyZ2VyIHRoZW4gZmVtYWxlcy4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKSsKICAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDgsMTkpKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKC44NywuODUpLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MS41LCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS41KSwgaGp1c3QgPSAwLjUpLAogICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiAgICAgICAgYXhpcy50ZXh0LnkgID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT04KSwKICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiAgeGxhYigiRW52aXJvbm1lbnQiKSArIHlsYWIoIkFyZWEgKGhhKSB1c2luZyAxMDAlIE1DUCIpCmFkai5zZWFzb25hbAoKIyBDb21iaW5lIHJhdyBhbmQgYWRqdXN0ZWQgc2Vhc29uYWwgaG9tZSByYW5nZXMgd2l0aCBhIHNpbmdsZSBjYXB0aW9uOgojIGdyaWQuYXJyYW5nZShyYXcuc2Vhc29uYWwsIGFkai5zZWFzb25hbCwgbnJvdyA9IDIsaGVpZ2h0cz11bml0KGMoMiwyKSwgYygiaW4iLCAiaW4iKSksCiMgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRHcm9iKCIiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udGZhY2UgPSAxLGZvbnRzaXplID0gMTApLGhqdXN0ID0gMCwgeCA9IDApKQoKIyBsaWJyYXJ5KGd0YWJsZSkKIyBnMiA8LSBnZ3Bsb3RHcm9iKHJhdy5zZWFzb25hbCkKIyBnMyA8LSBnZ3Bsb3RHcm9iKGFkai5zZWFzb25hbCkKIyBnIDwtIHJiaW5kKGcyLCBnMywgc2l6ZSA9ICJmaXJzdCIpCiMgZyR3aWR0aHMgPC0gdW5pdC5wbWF4KGcyJHdpZHRocywgZzMkd2lkdGhzKQojIGdyaWQubmV3cGFnZSgpCiMgZ3JpZC5kcmF3KGcpCgpgYGAKCgoKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClBvc3QtSG9jIGNvbXBhcmlzb25zIGJldHdlZW4gcG9wdWxhdGlvbnMgZm9yIHNlYXNvbmFsIGhvbWUgcmFuZ2UgYW5hbHlzaXM6CgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KZW1tX3MudCA8LSBlbW1lYW5zKFJNLm1vZC5TZWFzb24sIHBhaXJ3aXNlIH4gRW52aXJvbm1lbnQgfCBTZWFzb24pCmVtbV9zLnQKYGBgCgoKR3JhcGhpY2FsIENvbXBhcmlzb25zIG9mIHNlYXNvbnMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpbnM6CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIHBsb3QoU2V4LmVtbS5zZWFzLCBjb21wYXJpc29ucyA9IFRSVUUpCnBsb3QoZW1tX3MudCwgY29tcGFyaXNvbnMgPSBUUlVFKQpgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKRmlndXJlIDExIHwgUGFpcndpc2UgY29tcGFyaXNvbnMgb2YgZWFjaCBzZWFzb24gYmV0d2VlbiBlbnZpcm9ubWVudHMuIE92ZXJsYXBwaW5nIHJlZCBiYXJzIGluZGljYXRlIG5vIHN0YXRpc3RpY2FsIGRpZmZlcmVuY2UuIAoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgU2Vhcy5NZWFuc1Q8LWVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgbGlzdChwYWlyd2lzZSB+IEVudmlyb25tZW50LCBwYWlyd2lzZSB+IFNlYXNvbikpCiMgU2Vhcy5NZWFuc1QKCmVtbV9zLnQ0IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBTZWFzb24gfCBFbnZpcm9ubWVudCkKZW1tX3MudDQKYGBgCgoKR3JhcGhpY2FsIENvbXBhcmlzb25zIGJldHdlZW4gc2Vhc29ucyB3aXRoaW4gdGhlIHR3byBwb3B1bGF0aW9uczoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBsb3QoZW1tX3MudDQsIGNvbXBhcmlzb25zID0gVFJVRSkKYGBgCkZpZ3VyZSAxMiB8IFBhaXJ3aXNlIGNvbXBhcmlzb25zIGJldHdlZW4gc2Vhc29ucyB3aXRoaW4gZWFjaCBlbnZpcm9ubWVudCBhZ2FpbnN0IGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucy4gT3ZlcmxhcHBpbmcgcmVkIGJhcnMgaW5kaWNhdGUgbm8gc3RhdGlzdGljYWwgZGlmZmVyZW5jZS4gCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpzdWIgPC0gc3Vic2V0KHNlYXNvbmFsLCBFbnZpcm9ubWVudCA9PSAic3Vic2lkaXplZCIpCgpSTS5tb2QuU3ViIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+U2Vhc29uK1NleCtOK1NlYXNvbipTZXgrKDF8R2lsYSksIGRhdGE9c3ViKQoKZW1tX3MudDUgPC0gZW1tZWFucyhSTS5tb2QuU3ViLCBwYWlyd2lzZSB+IFNleCB8IFNlYXNvbikKZW1tX3MudDUgCmBgYAoKR3JhcGhpY2FsIENvbXBhcmlzb25zIGJldHdlZW4gc2V4IHdpdGhpbiB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uOgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KcGxvdChlbW1fcy50NSwgY29tcGFyaXNvbnMgPSBUUlVFKQpgYGAgICAKICAgCiAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKVGFibGUgNyB8IE1lYW4gaW5kaXZpZHVhbCBzZWFzb25hbCBob21lIHJhbmdlcyBwb29sZWQgZnJvbSB0aGUgZW50aXJlIHN0dWR5IHBlcmlvZC4gTWlzc2luZyB2YWx1ZXMgYXJlIGRlcGljdGVkIHdoZXJlIG5vIGxvY2F0aW9ucyBmb3IgdGhhdCBhbmltYWwgZHVyaW5nIHRoYXQgcGVyaW9kIHdlcmUgc3VjY2Vzc2Z1bGwuCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClNlYXMuSW5kLk1lYW5zPC1yZWFkLmNzdigiU2Vhc29uYWwgSFIgVGFibGUuY3N2IikKa2FibGUoU2Vhcy5JbmQuTWVhbnMsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1NlYXNvbmFsIEluZGl2aWR1YWwgSG9tZSBSYW5nZXMgKE1DUCkuJykKYGBgCgoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9Cm5vbnN1YiA8LSBzdWJzZXQoc2Vhc29uYWwsIEVudmlyb25tZW50ID09ICJub25zdWJzaWRpemVkIikKClJNLm1vZC5OU3ViIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+U2Vhc29uK1NleCtOK1NlYXNvbipTZXgrKDF8R2lsYSksIGRhdGE9bm9uc3ViKQoKZW1tX3MudDYgPC0gZW1tZWFucyhSTS5tb2QuTlN1YiwgcGFpcndpc2UgfiBTZXggfCBTZWFzb24pCmVtbV9zLnQ2IApgYGAKCkdyYXBoaWNhbCBDb21wYXJpc29ucyBiZXR3ZWVuIHNleCB3aXRoaW4gdGhlIG5vbi1zdWJzaWRpemVkIHBvcHVsYXRpb246CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQ2LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYCAgIAoKCgoKCiMjIFNlYXNvbmFsIEhvbWUgUmFuZ2UgKEtERSkKCgpUYWJsZSAgfCBSYXcgS0RFIGdyb3VwIG1lYW5zIG9mIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIGJldHdlZW4gc2V4ZXMgYXQgU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKS4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnNlYXNvbi5rZGU8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9JbnB1dC5jc3YiKQoKU0VBU19LREVfU2V4IDwtIHN1bW1hcnlTRShzZWFzb24ua2RlLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1a2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJTZWFzb24iLCJTZXgiKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0tERV9TZXgsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1JhdyBLREUgR3JvdXAgTWVhbnMgb2YgU2Vhc29uYWwgSG9tZSBSYW5nZXMgYmV0d2VlbiBzZXhlcycpCmBgYAoKIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KU0VBU19LREVfTWVhbnMgPC0gc3VtbWFyeVNFKHNlYXNvbi5rZGUsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfOTVrZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoIlNlYXNvbiIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfS0RFX01lYW5zLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdSYXcgS0RFIEdyb3VwIE1lYW5zIG9mIFNlYXNvbmFsIEhvbWUgUmFuZ2VzJykKYGBgCiAKIAoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBzZWFzb25hbDwtcmVhZC5jc3YoIlNDX1NlYXNvbmFsX0RhdGEuY3N2IikKClJNLktERS5TZWFzb24gPC0gbG1lcihIb21lX1JhbmdlXzk1a2RlflNlYXNvbitTZXgrTitTZWFzb24qU2V4KygxfEdpbGEpLCAKICAgICAgICAgICAgICAgICAgICAgIGRhdGE9c2Vhc29uLmtkZSkKc3VtbWFyeShSTS5LREUuU2Vhc29uKQpgYGAKIApBTk9WQSBUYWJsZS4gU2Vhc29uYWwgS0RFCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5LREUuU2Vhc29uKQpgYGAKCiAKClJhdyBTZWFzb25hbCBLREUgTWVhbnMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmdncGxvdChTRUFTX0tERV9TZXgsYWVzKHg9U2V4LCB5PUhvbWVfUmFuZ2VfOTVrZGUpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uPXBkKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzk1a2RlLXNlLCB5bWF4PUhvbWVfUmFuZ2VfOTVrZGUrc2UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgZmFjZXRfZ3JpZCh+U2Vhc29uKSArCiAgdGhlbWVfYncoKSArCiAgeGxhYigiU2V4IikgKyB5bGFiKCJBcmVhIChoYSkgdXNpbmcgOTUlIEtERSIpCmBgYAoKCgoKCkFkanVzdGVkIFNlYXNvbmFsIEtERSBNZWFucwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KUk0uS0RFLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfOTVrZGV+U2Vhc29uK1NleCtOK1NlYXNvbipTZXgrKDF8R2lsYSksIAogICAgICAgICAgICAgICAgICAgICAgZGF0YT1zZWFzb24ua2RlKQoKIyBSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNLm1vZC5TZWFzb24sIAojICAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyBSTS5tYXJnaW5hbAoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX0tERSA8LSBsc21lYW5zKFJNLktERS5TZWFzb24sIHNwZWNzID0gYygiU2Vhc29uIiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9LREUgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX0tERSkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMikKCmdncGxvdChyZWZfZGZSTV9LREUsYWVzKHg9U2V4LCB5PWxzbWVhbikpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMiwgcG9zaXRpb249cGQpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgZmFjZXRfZ3JpZCh+U2Vhc29uKSArCiAgeGxhYigiU2V4IikgKyB5bGFiKCJBcmVhIChoYSkgdXNpbmcgOTUlIEtERSIpCmBgYAoKIAoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmVtbV9zZXhfS0RFIDwtIGVtbWVhbnMoUk0uS0RFLlNlYXNvbiwgcGFpcndpc2UgfiBTZXggfCBTZWFzb24pCmVtbV9zZXhfS0RFIApgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zZXhfS0RFLCBjb21wYXJpc29ucz1UUlVFKQpgYGAKCgoKCgoKIyBIb21lIFJhbmdlIE92ZXJsYXAgKE1DUCkKCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+R2lsYSBNb25zdGVyIEhvbWUgUmFuZ2UgT3ZlcmxhcCBvZiAxMDAlIE1DUHMuPC9zcGFuPgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgptY3BfYW5hbHlzaXMuUE9MWSA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAgbWNwX291dCA8LSBtY3AoZGF0YS5zcCwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKfQoKTTY3X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTY3L002NyAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNNjlfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NNjkvTTY5IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0yNTVfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMjU1L00yNTUgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL00yMTUvTTIxNSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMTQvTTE0IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMTE5L00xMTkgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL00xMTIvTTExMiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQoKRjY2X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjY2L0Y2NiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMzZfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMzYvRjM2IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMjUyL0YyNTIgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjIxNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YyMTQvRjIxNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMjAwX01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjIwMC9GMjAwIC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTQ3L0YxNDcgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0Nl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxNDYvRjE0NiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTM3X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjEzNy9GMTM3IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMzVfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTM1L0YxMzUgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMTQvRjExNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTA0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjEwNC9GMTA0IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCgpNYWxlLk1DUCA8LSByYmluZChNNjdfTUNQLE02OV9NQ1AsTTI1NV9NQ1AsTTIxNV9NQ1AsTTE0X01DUCxNMTE5X01DUCxNMTEyX01DUCkKRmVtYWxlLk1DUCA8LSByYmluZChGNjZfTUNQLEYzNl9NQ1AsRjI1Ml9NQ1AsRjIxNF9NQ1AsRjIwMF9NQ1AsRjE0N19NQ1AsRjE0Nl9NQ1AsRjEzN19NQ1AsCiAgICAgICAgICAgICAgICAgICAgRjEzNV9NQ1AsRjExNF9NQ1AsRjEwNF9NQ1ApCgptYXB2aWV3T3B0aW9ucyhiYXNlbWFwcyA9IGMoIk9wZW5TdHJlZXRNYXAiLCJFc3JpLldvcmxkSW1hZ2VyeSIsIk9wZW5Ub3BvTWFwIiksCiAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIm1hZ2VudGEiLAogICAgICAgICAgICAgICBsYXllcnMuY29udHJvbC5wb3MgPSAidG9wbGVmdCIpCgptYXB2aWV3KE1hbGUuTUNQLCBsZWdlbmQ9RiwgemNvbD0iaWQiLCBjb2wucmVnaW9ucyA9IGMoImJsdWUiKSwgYWxwaGEucmVnaW9ucz0wLjMpICsgCiAgbWFwdmlldyhGZW1hbGUuTUNQLCBsZWdlbmQ9RiwgemNvbCA9ICJpZCIsIGNvbC5yZWdpb25zID0gYygicmVkIiksIGFscGhhLnJlZ2lvbnM9MC4zKQpgYGAKRmlndXJlIDEzIHwgSW50ZXJhY3RpdmUgbWFwOiBIb21lIFJhbmdlIG92ZXJsYXAgYnkgc2V4IG9mIDEwMCUgTUNQcyBhdCBTdG9uZSBDYW55b24uIFJlZCBwb2x5Z29ucyByZXByZXNlbnQgZmVtYWxlIGxpemFyZHMsIGFuZCBibHVlIHJlcHJlc2VudHMgbWFsZSBsaXphcmRzLiAKCgoKCgpUaGUgU3RvbmUgQ2FueW9uIHBvcHVsYXRpb24gc2VlbXMgdG8gZXhoaWJpdCBncmVhdGVyIGZlbWFsZS1mZW1hbGUgb3ZlcmxhcCBhcyB3ZWxsIGFzIGNvbnNpZGVyYWJsZSBvdmVybGFwIG9mIG1hbGUtZmVtYWxlIGhvbWUgcmFuZ2VzLiBUaGVyZSBhcHBlYXJzIHRvIGJlIGxpbWl0ZWQgbWFsZS1tYWxlIG92ZXJsYXAsIHdpdGggb2NjdXJhbmNlIGhhcHBlbmluZyBpbiBvbmx5IHR3byBtYWxlLW1hbGUgaG9tZSByYW5nZSBwb2x5Z29ucy4gVGhpcyBmaW5kaW5nIGlzIGluIGNvbnRyYXN0IHRvIHRoZSBPd2wgSGVhZCBidXR0ZXMgc3R1ZHkgd2hpY2ggcmV2ZWFsZWQgdGhhdCB0aGVyZSB3YXMgYSBsYXJnZSBkZWdyZWUgb2Ygb3ZlcmxhcCBhbW9uZyBtYWxlLWZlbWFsZSBhbmQgbWFsZS1tYWxlIG92ZXJsYXBzIChUYWJsZSB4KS4gR2lsbGFyZG8gY29uY2x1ZGVkIHRoYXQsIGluIHRoZWlyIHN0dWR5LCB0aGUgaGlnaCBkZWdyZWUgb2Ygb3ZlcmxhcCBpbiBtYWxlcy1tYWxlcyBpbnRlcmFjdGlvbnMgbWF5IGJlIGR1ZSB0byBoYXZpbmcgbGFyZ2VyIGhvbWUgcmFuZ2VzIGZvciBtYXRlIHNlYXJjaGluZyBhY3Rpdml0aWVzLiBNYWxlcyBtYXkgaGF2ZSBhbmQgaW5jcmVhc2VkIGhvbWUgcmFuZ2Ugc2l6ZSB0byBtYXhpbWl6ZSB0aGVpciBhY2Nlc3MgdG8gbXVsdGlwbGUgZmVtYWxlcy4gU2hlIGNvbmNsdWRlZCB0aGF0IHRoZSBsYWNrIG9mIGZlbWFsZS1mZW1hbGUgb3ZlcmxhcCBtYXkgYmUgZHVlIHRvIHNtYWxsZXIgaG9tZSByYW5nZSBzaXplcy4gCgpBdCBTdG9uZSBDYW55b24sIG1hbGVzIGhhdmUgcmVkdWNlZCBob21lIHJhbmdlIHNpemVzIChUYWJsZSA2OyBGaWcuIDQpLiBIb3dldmVyLCBtYWxlcyBzdGlsbCByZXRhaW4gaG9tZSByYW5nZSBvdmVybGFwIHdpdGggbXVsdGlwbGUgZmVtYWxlcyB3aGlsZSBoYXZpbmcgcmVkdWNlZCBjb250YWN0IHdpdGggb3RoZXIgbWFsZXMuIFRoaXMgbWF5IGJlIGluIHJlc3BvbnNlIHRvIG51dHJpZW50IHN1YnNpZGllcyB0aGF0IHJlZHVjZSB0aGUgbmVlZCB0byBoYXZlIGV4cGFuZGVkIGhvbWUgcmFuZ2Ugc2l6ZXMgZm9yIGZvcmFnaW5nIGFjdGl2aXRpZXMgZm9yIGJvdGggbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXJlIG1heSBhbHNvIGJlIGEgaGlnaGVyIGRlbnNpdHkgb2YgZmVtYWxlcyBhcyBhIHJlc3BvbnNlIHRvIHJlc291cmNlIGF2YWlsYWJpbGl0eSBhbmQgcmVkdWNlZCByYW5nZSByZXF1aXJlbWVudHMuIE1hbGVzIGFyZSBub3QgZm9yY2VkIHRvIGV4cGFuZCBob21lIHJhbmdlcyBmb3IgbWF0ZSBzZWFyY2hpbmcgdG8gdGhlIGV4dGFudCB0aGF0IGluZGl2aWR1YWxzIGF0IE93bCBIZWFkIEJ1dHRlcyBtYXkgYmUgc3ViamVjdCB0by4gCgoKClRhYmxlIDggfCBIb21lIHJhbmdlIG92ZXJsYXAgb2YgR2lsYSBNb25zdGVycyBhdCB0aGUgbnV0cmllbnQgc3Vic2lkaXplZCBzaXRlLiBNYWxlLW1hbGUgb3ZlcmxhcHMgb25seSBvY2N1cmVkIGJldHdlZW4gdHdvIHBhaXJzIG9mIG1hbGVzOiBNMTQtTTY5IGFuZCBNMTE5LU0yMTUgYXQgMC41IGhhLiBhbmQgMTkuNSBoYS4gcmVzcGVjdGl2ZWx5IGFuZCB3ZXJlIHRoZXJlZm9yZSBub3QgaW5jbHVkZWQgaW4gdGhlIHRhYmxlLiAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9Ck9MX1RhYmxlPC1yZWFkLmNzdigiLi9PdmVybGFwL092ZXJMYXBfVGFibGUuY3N2IikKCmthYmxlKE9MX1RhYmxlLCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdIb21lIHJhbmdlIG92ZXJsYXAgb2YgU3RvbmUgQ2FueW9uIEdpbGEgTW9uc3RlcnMgdXNpbmcgMTAwJSBNQ1BzLicpCmBgYAoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpoci5vdmVybGFwPC1yZWFkLmNzdigiLi9PdmVybGFwL0hSX092ZXJsYXBfRGF0YS5jc3YiKQoKaHIub3ZlcmxhcC5hbmFsIDwtIHN1bW1hcnlTRShoci5vdmVybGFwLCBtZWFzdXJldmFyPSJPTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiSW50ZXJhY3Rpb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShoci5vdmVybGFwLmFuYWwsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0hvbWUgUmFuZ2UgT3ZlcmxhcCBTdW1tYXJ5JykKYGBgCgoKCgojIEhvbWUgUmFuZ2UgT3ZlcmxhcCAoS0RFKQoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQoKa2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbiA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAga2RlPC1rZXJuZWxVRChkYXRhLnNwLCBoPSJocmVmIiwga2Vybj0iYml2bm9ybSIsIGdyaWQ9MTAwMCkKICB2ZXIgPC0gZ2V0dmVydGljZXNocihrZGUsIHBlcmNlbnRhZ2UpCiAgdmVyQHByb2o0c3RyaW5nPC1DUlMuU0MKICB2ZXIKfQoKTTY3X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjcvTTY3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTY5X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NNjkvTTY5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTI1NV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTIxNV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTIxNS9NMjE1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTE0X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTQvTTE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExOV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKTTExMl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vTTExMi9NMTEyIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKCkY2Nl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjY2L0Y2NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYzNl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyNTJfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyNTIvRjI1MiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMTQvRjIxNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYyMDBfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDcvRjE0NyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxNDZfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxNDYvRjE0NiAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMzVfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMzUvRjEzNSAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMTQvRjExNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCkYxMDRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gOTUpCgpNYWxlLktERSA8LSByYmluZChNNjdfS0RFLE02OV9LREUsTTI1NV9LREUsTTIxNV9LREUsTTE0X0tERSxNMTE5X0tERSxNMTEyX0tERSkKRmVtYWxlLktERSA8LSByYmluZChGNjZfS0RFLEYzNl9LREUsRjI1Ml9LREUsRjIxNF9LREUsRjIwMF9LREUsRjE0N19LREUsRjE0Nl9LREUsRjEzN19LREUsCiAgICAgICAgICAgICAgICAgICAgRjEzNV9LREUsRjExNF9LREUsRjEwNF9LREUpCgptYXB2aWV3T3B0aW9ucyhiYXNlbWFwcyA9IGMoIk9wZW5TdHJlZXRNYXAiLCJFc3JpLldvcmxkSW1hZ2VyeSIsIk9wZW5Ub3BvTWFwIiksCiAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIm1hZ2VudGEiLAogICAgICAgICAgICAgICBsYXllcnMuY29udHJvbC5wb3MgPSAidG9wbGVmdCIpCgptYXB2aWV3KE1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbD0iaWQiLCBjb2wucmVnaW9ucyA9IGMoImJsdWUiKSwgYWxwaGEucmVnaW9ucz0wLjMpICsgCiAgbWFwdmlldyhGZW1hbGUuS0RFLCBsZWdlbmQ9RiwgemNvbCA9ICJpZCIsIGNvbC5yZWdpb25zID0gYygicmVkIiksIGFscGhhLnJlZ2lvbnM9MC4zKQpgYGAKRmlndXJlIDE0IHwgSW50ZXJhY3RpdmUgbWFwOiBIb21lIFJhbmdlIG92ZXJsYXAgYnkgc2V4IG9mIDk1JSBLREVzIGF0IFN0b25lIENhbnlvbi4gUmVkIHBvbHlnb25zIHJlcHJlc2VudCBmZW1hbGUgbGl6YXJkcywgYW5kIGJsdWUgcmVwcmVzZW50cyBtYWxlIGxpemFyZHMuIAoKCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQoKIyBrZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIgPC0gZnVuY3Rpb24oZmlsZW5hbWUpewojICAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUpCiMgICB4IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSRFQVNUSU5HKQojICAgeSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEkTk9SVEhJTkcpCiMgICB4eSA8LSBjKHgseSkKIyAgIGRhdGEucHJvaiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKHh5LGRhdGEsIHByb2o0c3RyaW5nID0gQ1JTLlNDKQojICAgeHkgPC0gU3BhdGlhbFBvaW50cyhkYXRhLnByb2pAY29vcmRzKQojICAga2RlPC1rZXJuZWxVRCh4eSwgaD0iaHJlZiIsIGtlcm49ImJpdm5vcm0iLCBncmlkPTEwMDApCiMgICBrZGVAcHJvajRzdHJpbmc8LSBDUlMuU0MKIyAgIGtkZQojIH0KCk0xMTIucmFzdGVyLm91dHB1dDwta2RlX2FuYWx5c2lzLmhyZWYucmFzdGVyKCIuL00xMTIvTTExMiAuY3N2IikKRjExNC5yYXN0ZXIub3V0cHV0PC1rZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIoIi4vRjExNC9GMTE0IC5jc3YiKQpGMjAwLnJhc3Rlci5vdXRwdXQ8LWtkZV9hbmFseXNpcy5ocmVmLnJhc3RlcigiLi9GMjAwL0YyMDAgLmNzdiIpCiMgcGxvdChNMTEyLnJhc3Rlci5vdXRwdXQpCiMgbWFwdmlldyhNMTEyLnJhc3Rlci5vdXRwdXQsIGFscGhhLnJlZ2lvbnM9MC44KQoKTTExMi5yYXN0ZXI8LXJhc3RlcihNMTEyLnJhc3Rlci5vdXRwdXQpCkYxMTQucmFzdGVyPC1yYXN0ZXIoRjExNC5yYXN0ZXIub3V0cHV0KQpGMjAwLnJhc3RlcjwtcmFzdGVyKEYyMDAucmFzdGVyLm91dHB1dCkKCgpsaWJyYXJ5KHRtYXApCiMgY3JlYXRlcyBhIGJvdW5kaW5nIGJveCBiYXNlZCBvbiB0aGUgZXh0ZW50cyBvZiB0aGUgcG9seWdvbgojYm91bmRpbmdfYm94IDwtIGJiKE91dHB1dC5BcmVhcykKTTExMi5iYiA8LSBNMTEyX0tERUBiYm94CkYxMTQuYmIgPC0gRjExNF9LREVAYmJveApGMjAwLmJiIDwtIEYyMDBfS0RFQGJib3gKCgojIG1hcHMgdGhlIHJhc3RlciB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveAojIHRtX3NoYXBlKE0xMTIucmFzdGVyLCBiYm94ID0gTTExMi5iYikgKyB0bV9yYXN0ZXIoInVkIikKCiMgbWFzayB0aGUgcmFzdGVyIGJ5IHRoZSBvdXRwdXQgYXJlYSBwb2x5Z29uCk0xMTIubWFza2VkIDwtIG1hc2soTTExMi5yYXN0ZXIsIE0xMTJfS0RFKQojIE0xMTIubWFza2VkW2lzLm5hKE0xMTIubWFza2VkKV0gPC0gMApGMTE0Lm1hc2tlZCA8LSBtYXNrKEYxMTQucmFzdGVyLCBGMTE0X0tERSkKIyBGMTE0Lm1hc2tlZFtpcy5uYShGMTE0Lm1hc2tlZCldIDwtIDAKRjIwMC5tYXNrZWQgPC0gbWFzayhGMjAwLnJhc3RlciwgRjIwMF9LREUpCiMgRjIwMC5tYXNrZWRbaXMubmEoRjIwMC5tYXNrZWQpXSA8LSAwCgpwbG90KE0xMTIubWFza2VkKQojIG1hcHZpZXcoTTExMi5tYXNrZWQsIGFscGhhLnJlZ2lvbnM9MC42KQoKdG1fbGF5b3V0KG1haW4udGl0bGU9Ik0xMTIgRjExNCBhbmQgRjIwMCBLREUgT3ZlcmxhcCIpK3RtX3NoYXBlKE0xMTIubWFza2VkKSArCiAgdG1fcmFzdGVyKCJ1ZCIsIHN0eWxlID0gInF1YW50aWxlIiwgbiA9IDEwMCwgbGVnZW5kLnNob3cgPSBGQUxTRSwgcGFsZXR0ZSA9ICItWWxHbkJ1IikgKwogIHRtX3NoYXBlKEYxMTQubWFza2VkKSArIAogIHRtX3Jhc3RlcigidWQiLCBzdHlsZSA9ICJxdWFudGlsZSIsIG4gPSAxMDAsIGxlZ2VuZC5zaG93ID0gRkFMU0UsIHBhbGV0dGUgPSAiLVlsR25CdSIpICsKICB0bV9zaGFwZShGMjAwLm1hc2tlZCkgKwogIHRtX3Jhc3RlcigidWQiLCBzdHlsZSA9ICJxdWFudGlsZSIsIG4gPSAxMDAsIGxlZ2VuZC5zaG93ID0gRkFMU0UsIHBhbGV0dGUgPSAiLVlsR25CdSIpICsKICB0bV9zaGFwZShNMTEyX0tERSkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS4zLCBjb2wgPSAiYmxhY2siKSArIAogIHRtX3NoYXBlKEYxMTRfS0RFKSArIAogIHRtX2JvcmRlcnMoYWxwaGE9LjMsIGNvbCA9ICJibGFjayIpICsgCiAgdG1fc2hhcGUoRjIwMF9LREUpICsgCiAgdG1fYm9yZGVycyhhbHBoYT0uMywgY29sID0gImJsYWNrIikgKwogIHRtX2xheW91dChmcmFtZSA9IEZBTFNFKQogIAojICwgYmJveCA9IE0xMTIuYmIKIyBjb21wdXRlIGhvbWVyYW5nZXMgZm9yIDUwJSwgOTUlIG9mIHBvaW50cywgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYXMgc3BhdGlhbCBwb2x5Z29uIGRhdGEgZnJhbWVzCk0xMTIucmFuZ2U5NSA8LSBnZXR2ZXJ0aWNlc2hyKE0xMTIucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDk1KQpNMTEyLnJhbmdlNTAgPC0gZ2V0dmVydGljZXNocihNMTEyLnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA1MCkKRjExNC5yYW5nZTk1IDwtIGdldHZlcnRpY2VzaHIoRjExNC5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gOTUpCkYxMTQucmFuZ2U1MCA8LSBnZXR2ZXJ0aWNlc2hyKEYxMTQucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDUwKQpGMjAwLnJhbmdlOTUgPC0gZ2V0dmVydGljZXNocihGMjAwLnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA5NSkKRjIwMC5yYW5nZTUwIDwtIGdldHZlcnRpY2VzaHIoRjIwMC5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gNTApCgp0bV9sYXlvdXQobWFpbi50aXRsZT0iTTExMiBGMTE0IGFuZCBGMjAwIEtERSBPdmVybGFwIikrCnRtX3NoYXBlKE0xMTIucmFuZ2U5NSkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2ZiNmE0YSIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNmYjZhNGEiKSArCnRtX3NoYXBlKE0xMTIucmFuZ2U1MCkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2RlMmQyNiIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNkZTJkMjYiKSArCnRtX2xheW91dChmcmFtZSA9IEZBTFNFKSArCnRtX3NoYXBlKEYxMTQucmFuZ2U5NSkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2ZiNmE0YSIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNmYjZhNGEiKSArCnRtX3NoYXBlKEYxMTQucmFuZ2U1MCkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2RlMmQyNiIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNkZTJkMjYiKSArCnRtX2xheW91dChmcmFtZSA9IEZBTFNFKSArIAp0bV9zaGFwZShGMjAwLnJhbmdlOTUpICsgdG1fYm9yZGVycyhhbHBoYT0uNywgY29sID0gIiNmYjZhNGEiLCBsd2QgPSAyKSArIHRtX2ZpbGwoYWxwaGE9LjEsIGNvbCA9ICIjZmI2YTRhIikgKwp0bV9zaGFwZShGMjAwLnJhbmdlNTApICsgdG1fYm9yZGVycyhhbHBoYT0uNywgY29sID0gIiNkZTJkMjYiLCBsd2QgPSAyKSArIHRtX2ZpbGwoYWxwaGE9LjEsIGNvbCA9ICIjZGUyZDI2IikgKwp0bV9sYXlvdXQoZnJhbWUgPSBGQUxTRSkKCiMjIHdyaXRlIHJhc3RlciBmaWxlcyB0byBjb21wdXRlcjogCiMgd3JpdGVSYXN0ZXIobWFza2VkX2tkZSwgZmlsZW5hbWUgPSAia2VybmVsX2RlbnNpdHkudGlmIikKYGBgCgoKCgo=